需要有关.net 4 WCF REST API-XML输出格式的帮助 [英] Need help with .net 4 WCF REST API - XML output formatting
问题描述
我已经在VS2010中使用.NET 4示例构建了一些REST API类.
I have built some REST API classes using the .NET 4 samples in VS2010.
返回的XML格式与我要求的格式有很大不同.有什么办法可以控制XML输出的布局?
The format of the XML returned is very different from what I require. Is there any way I can control the layout of the XML output?
我需要以以下格式生成简单的XML输出...
I need to generate simple XML output in the following format...
动词:GET
URI:/api/files/< groupid>/
URI: /api/files/<groupid>/
输出:内容类型:text/xml
Output: Content-Type: text/xml
<?xml version ="1.0">
<?xml version="1.0">
< api>
<api>
< files>
<files>
< file>
<file>
< id> [int]</id>
<id>[int]</id>
< name> [string]</id>
<name>[string]</id>
</file>
</file>
</files>
</files>
</api>
</api>
我得到的输出如下...
The output I get follows...
<b;< ArrayOfFileItem xmlns =" http://schemas.datacontract.org/2004/07/WcfRestService1 " xmlns:i =" http://www.w3.org/2001/XMLSchema-instance >> ;
<ArrayOfFileItem xmlns="http://schemas.datacontract.org/2004/07/WcfRestService1" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
< FileItem>
< Id> 5890</Id>
<名称> Ver01</名称>
</FileItem>
<FileItem>
<Id>5890</Id>
<Name>Ver01</Name>
</FileItem>
<b;< FileItem>< Id> 5891</Id><名称> Ver02</Name></FileItem>
< FileItem>< Id> 50054</Id><名称> Test1</Name></FileItem>
< FileItem>< Id> 50055</Id><名称> Test2</Name></FileItem>
< FileItem>< Id> 50061</Id><名称> Test3</Name></FileItem>
< FileItem>< Id> 50062</Id><名称> Test4</Name></FileItem>
< FileItem>< Id> 50063</Id><名称> Test5</Name></FileItem>
</ArrayOfFileItem>
<FileItem><Id>5891</Id><Name>Ver02</Name></FileItem>
<FileItem><Id>50054</Id><Name>Test1</Name></FileItem>
<FileItem><Id>50055</Id><Name>Test2</Name></FileItem>
<FileItem><Id>50061</Id><Name>Test3</Name></FileItem>
<FileItem><Id>50062</Id><Name>Test4</Name></FileItem>
<FileItem><Id>50063</Id><Name>Test5</Name></FileItem>
</ArrayOfFileItem>
具有以下标头信息
HTTP/1.1 200 OK
HTTP/1.1 200 OK
服务器:ASP.NET开发服务器/10.0.0.0
Server: ASP.NET Development Server/10.0.0.0
日期:2011年6月23日,星期四,格林尼治标准时间
Date: Thu, 23 Jun 2011 00:01:39 GMT
X-AspNet版本:4.0.30319
X-AspNet-Version: 4.0.30319
内容长度:520
Content-Length: 520
&Set-Cookie:ASP.NET_SessionId = uutzntkijzqvv23eoef44o0w;路径=/; HttpOnly
Set-Cookie: ASP.NET_SessionId=uutzntkijzqvv23eoef44o0w; path=/; HttpOnly
缓存控制:私有
Cache-Control: private
Content-Type:application/xml; charset = utf-8
Content-Type: application/xml; charset=utf-8
连接:关闭
Connection: Close
我正在使用的代码片段如下...
The code fragment I am using follows...
[ServiceContract]
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
//注意:如果服务已重命名,请记住更新global.asax.cs文件
// NOTE: If the service is renamed, remember to update the global.asax.cs file
公共类文件
{
//TODO:实现将包含SampleItem实例的收集资源
// TODO: Implement the collection resource that will contain the SampleItem instances
//[WebGet(UriTemplate =" {groupid}"))]
//[WebGet(UriTemplate = "{groupid}")]
[OperationContract]
[OperationContract]
[WebGet(
BodyStyle = WebMessageBodyStyle.Bare,
BodyStyle = WebMessageBodyStyle.Bare,
ResponseFormat = WebMessageFormat.Xml,
ResponseFormat = WebMessageFormat.Xml,
UriTemplate ="{groupid}"
UriTemplate = "{groupid}"
)]
公共列表< FileItem> GetCollection(字符串组ID)
public List<FileItem> GetCollection(string groupid)
{
FileItem pi =新的FileItem();
FileItem pi = new FileItem();
如果(pi == null)
if (pi == null)
抛出新的WebFaultException(System.Net.HttpStatusCode.NotFound);
throw new WebFaultException(System.Net.HttpStatusCode.NotFound);
返回pi.GetFileItems(userid,groupid);
return pi.GetFileItems(userid, groupid);
}
推荐答案
您将需要使用一些收集数据协定来获得所需的内容-以下代码可以做到这一点.请注意,它仍将在响应的开头添加一个名称空间声明(您可以通过移至XmlSerializer来将其删除,但是随后您需要 更改类中的属性.这是服务返回的内容:
You'll need to use some collection data contracts to get what you need - the code below does that. Notice that it will still add a namespace declaration at the beginning of the response (you can remove it by moving to the XmlSerializer, but then you'll need to change the attributes in your class. This is what the service returns:
< api xmlns:i =" http://www.w3.org/2001/XMLSchema-instance">
<文件>
< file>< id> 1</id><名称>文件1</name></file>
<文件>< id> 2</id>名称>文件2</名称</file>
</files>
</api>
<api xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<files>
<file><id>1</id><name>File 1</name></file>
<file><id>2</id><name>File 2</name></file>
</files>
</api>
和代码:
public class Post_d74d242f_bd01_4850_9971_de8d4f3b45b2
{
//<?xml version="1.0">
//<api>
// <files>
// <file>
// <id>[int]</id>
// <name>[string]</id>
// </file>
// </files>
//</api>
[ServiceContract]
public class Service
{
[WebGet(UriTemplate = "/api/files/{groupId}")]
public Api GetCollection(string groupId)
{
return new Api
{
Files = new Files
{
new FileItem { Id = 1, Name = "File 1" },
new FileItem { Id = 2, Name = "File 2" },
}
};
}
}
[DataContract(Name = "api", Namespace = "")]
public class Api
{
[DataMember(Name = "files")]
public Files Files { get; set; }
}
[CollectionDataContract(Name = "files", ItemName = "file", Namespace = "")]
public class Files : List<FileItem> { }
[DataContract(Namespace = "", Name = "FileItem")]
public class FileItem
{
[DataMember(Name = "id")]
public int Id { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
}
public static void Test()
{
string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
WebServiceHost host = new WebServiceHost(typeof(Service), new Uri(baseAddress));
host.Open();
Console.WriteLine("Host opened");
WebClient c = new WebClient();
Console.WriteLine(c.DownloadString(baseAddress + "/api/files/group"));
Console.Write("Press ENTER to close the host");
Console.ReadLine();
host.Close();
}
}
这篇关于需要有关.net 4 WCF REST API-XML输出格式的帮助的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!