7

我在 C# 中创建了一个 Web 服务 (REST)。现在我希望当有人使用它时,它应该根据 Header 返回 JSON 或 XML。我在这里找到了一个很好的教程。我跟着它,但我不知道它在哪里说set both the HTTP Accept and Content-Type headers to "application/xml",我是这样称呼它的http://localhost:38477/social/name。如果我的问题对您来说不是很清楚,我可以回答任何问题谢谢这是我的代码

[WebInvoke(UriTemplate = "{Name}", Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml)]
        public MyclassData Get(string Name)
        {
            // Code to implement
            return value;

        }
4

3 回答 3

5

您使用什么框架(看起来像旧的 WCf Web Api)来构建您的 RESTful 服务?我强烈推荐使用微软新的 MVC4 Web API。它真正开始成熟并极大地简化了构建 RESTful 服务。在 WCF Web API 即将停止使用的情况下,它将支持它。

您只需将 ModelClass 作为返回类型返回,它会根据请求接受标头自动将其序列化为 XML 或 JSON。您避免编写重复的代码,并且您的服务将支持广泛的客户端。

public class TwitterController : ApiController
{
     DataScrapperApi api = new DataScrapperApi();
     TwitterAndKloutData data = api.GetTwitterAndKloutData(screenName);
     return data;
}

public class TwitterAndKloutData
{
   // implement properties here
}

链接

您可以通过仅下载 MVC4 2012 RC 来获取 MVC4 Web Api,也可以下载整个 Visual Studio 2012 RC。

MVC 4:http ://www.asp.net/mvc/mvc4

VS 2012: http: //www.microsoft.com/visualstudio/11/en-us/downloads


对于原始的 wcf web api,试一试。检查接受标头并根据其值生成响应。

var context = WebOperationContext.Current
string accept = context.IncomingRequest.Accept;
System.ServiceModel.Chanells.Message message = null;

if (accept == "application/json")
   message = context.CreateJsonResponse<TwitterAndCloutData>(data);
else if (accept == "text/xml")
   message = context.CreateXmlResponse<TwitterAndCloutData>(data);

return message;

您可以在发起请求的任何客户端上设置接受标头。这将根据您用于发送请求的客户端类型而有所不同,但任何 http 客户端都可以添加标头。

WebClient client = new WebClient();
client.Headers.Add("accept", "text/xml");
client.DownloadString("domain.com/service");

要访问您将使用的响应标头

WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";

其他资源:http ://dotnet.dzone.com/articles/wcf-rest-xml-json-or-both

于 2012-07-08T17:45:30.267 回答
4

RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml您在属性中指定了WebInvoke将请求和响应的格式都限制为 Xml 的属性。移除 RequestFormat 和 ResponseFormat属性,让框架基于 Http 标头对其进行处理。Content-type标头指定请求正文类型,Accept标头指定响应正文类型。

编辑:

这就是您使用 fiddler 发送请求的方式。

在此处输入图像描述

您可以使用REST 入门工具包附带的Microsoft.HttpMicrosoft.Http.Extensions dll 来编写客户端代码。下面是一个示例。

        var client = new HttpClient("http://localhost:38477/social");
        client.DefaultHeaders.Accept.AddString("application/xml");
        client.DefaultHeaders.ContentType = "application/xml";
        HttpResponseMessage responseMessage = client.Get("twitter_name");
        var deserializedContent = responseMessage.Content.ReadAsDataContract<YourTypeHere>();
于 2012-07-08T18:05:51.273 回答
-1

您可以像这样为您的方法创建两个重载吗:

    [WebInvoke(UriTemplate = "dostuff", Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
    public StuffResponse DoStuff(RequestStuff requestStuff)


    [WebInvoke(UriTemplate = "dostuff", Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml)]
    public StuffResponse DoStuff(RequestStuff requestStuff)
于 2012-07-08T17:34:24.003 回答