需要有关.net 4 WCF REST API-XML输出格式的帮助 [英] Need help with .net 4 WCF REST API - XML output formatting

查看:90
本文介绍了需要有关.net 4 WCF REST API-XML输出格式的帮助的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆