在 C# 中将 HTTP Accept 和 Content-Type 标头都设置为“application/xml”

Posted

技术标签:

【中文标题】在 C# 中将 HTTP Accept 和 Content-Type 标头都设置为“application/xml”【英文标题】:set both the HTTP Accept and Content-Type headers to "application/xml" in C# 【发布时间】:2012-07-08 06:14:26 【问题描述】:

我在 C# 中创建了一个 Web 服务 (REST)。现在我希望当有人使用它时,它应该根据 Header 返回 JSON 或 XML。我找到了一个很好的tutorial here。我跟着它,但我不知道它在哪里说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;

        

【问题讨论】:

您是否已经在您的休息服务中使用 WebInvoke 和 WebGet 属性,这两个属性都有设置 RequestFormat 和 ResponseFormat 的属性 @HatSoft 谢谢,@Misha 指出了同样的事情,但它不起作用 请在此处复制/粘贴代码,以便我们进一步为您提供帮助 【参考方案1】:

您使用什么框架(看起来像旧的 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

【讨论】:

我尊重你的意见,但我不想因为这个错误而改变我的整个服务。我的意思是我想学习并知道我的问题的答案,下次我肯定会使用 MVC4 ..+1 表示新想法:) @despertar - WCF 基础结构将根据 Http 标头自动处理请求/响应序列化/反序列化以正确格式(json 或 xml)。除非您正在做一些额外的工作,否则您不需要专门处理(使用任何代码),我认为这不是问题所要求的。 我在我的函数中写了这个,现在返回类型不匹配。我不想更改返回类型... @muruge 你说的很对..但问题是如何在 global.asax 中更改 http 标头? @muruge 啊,是的,听起来不错。很久没用老版的web api了,谢谢提醒+1。用户 - 您的 http 标头不是全局配置的,而是按请求处理的。您可能希望一种方法使用 text/plain,另一种方法使用 text/xml 或 application/json。正如 muruge 所说,如果您只是删除 ResponseFormat.XML,则 Http Header 应根据请求接受标头自动设置为适当的类型。【参考方案2】:

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

编辑:

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

您可以使用 REST starter kit 附带的 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>();

【讨论】:

问题是我们应该在哪里写这个 i-e Content-type 和 header? 发送请求时应在客户端设置标头。我将编辑我的答案以展示您如何实现这一目标。 你认为人们会使用 fiddler 来查看输出吗?此外,我如何在提琴手中看到响应? Fiddler 是一个很好的调试 Web 服务的工具。就个人而言,我认为它是开发人员在应用程序的中间层组件上工作的必备工具之一。要回答您的问题 - 您可以转到 Inspectors 选项卡查看回复。 @user1391118:向我们展示您尝试过的代码,以便我们帮助您修复它。【参考方案3】:

你能像这样为你的方法创建两个重载吗:

    [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)

【讨论】:

"方法不允许。请参阅服务帮助页面以构造对服务的有效请求。" 对不起,您需要在 2 种方法中使用不同的参数才能使它们起作用。 我只是实现了一个函数,我认为没有参数问题:)

以上是关于在 C# 中将 HTTP Accept 和 Content-Type 标头都设置为“application/xml”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 .Net / C# 中将日期转换为 HTTP 格式的日期

如何在数据工厂管道中将路由传递给 Azure 函数(C#)http 触发器?

在 Dart (Flutter) 中将日期时间转换为 C# timetick [关闭]

.NET C#事务处理

在 swift 5.2 con Alamofire 中将数据(json)传递给另一个控制器

在c#中将html转换为json