Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将HTTP Accept和Content Type标头都设置为";“应用程序/xml”;在C中#_C#_Xml_Json_Wcf_C# 4.0 - Fatal编程技术网

C# 将HTTP Accept和Content Type标头都设置为";“应用程序/xml”;在C中#

C# 将HTTP Accept和Content Type标头都设置为";“应用程序/xml”;在C中#,c#,xml,json,wcf,c#-4.0,C#,Xml,Json,Wcf,C# 4.0,我用C#创建了一个web服务(REST)。现在我希望当有人使用它时,它应该按照头返回JSON或XML。我发现了一个非常好的方法。我遵循了它,但我不知道它在哪里说将HTTP接受和内容类型头都设置为“application/xml”,我这样称呼它http://localhost:38477/social/name。如果我的问题你不太清楚,我可以回答任何问题 谢谢 这是我的密码 [WebInvoke(UriTemplate = "{Name}", Method = "POST", BodyStyle

我用C#创建了一个web服务(REST)。现在我希望当有人使用它时,它应该按照头返回JSON或XML。我发现了一个非常好的方法。我遵循了它,但我不知道它在哪里说
将HTTP接受和内容类型头都设置为“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(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)

您使用什么框架(看起来像旧的WCf Web Api)来构建RESTful服务?我强烈推荐使用微软新的MVC4WebAPI。它真正开始成熟,并大大简化了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:

与2012年相比:


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

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;
要访问您将使用的响应头

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

其他资源:

您已经在
WebInvoke
属性中指定了
RequestFormat=WebMessageFormat.Xml,ResponseFormat=WebMessageFormat.Xml
,该属性将请求和响应的格式限制为Xml删除RequestFormat和ResponseFormat属性,让框架基于Http头对其进行处理内容类型标头指定请求正文类型,接受标头指定响应正文类型

编辑:

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

您可以使用随附的用于编写客户端代码的Microsoft.HttpMicrosoft.Http.ExtensionsDLL。下面是一个例子

        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>();
var-client=新的HttpClient(“http://localhost:38477/social");
client.DefaultHeaders.Accept.AddString(“application/xml”);
client.DefaultHeaders.ContentType=“应用程序/xml”;
HttpResponseMessage responseMessage=client.Get(“twitter_name”);
var deserializedContent=responseMessage.Content.ReadAsDataContract();

您是否已经在rest服务中使用WebInvoke&WebGet属性,这两个属性都具有设置RequestFormat&ResponseFormat@HatSoft谢谢,@Misha指出了同样的问题,但它不起作用。请复制/粘贴代码,以便我们能进一步帮助您“不允许使用此方法。请参阅服务帮助页,以构造对服务的有效请求。“啊,很抱歉,这两种方法需要不同的参数才能工作。我只实现了一个func,我认为没有参数问题:)我尊重你的意见,但我不想因为这个错误而改变我的整个服务。我的意思是我想学习并知道我问题的答案,当然,下一次我将使用MVC4..+1来实现新想法:)@despertar-WCF基础设施将根据Http头自动处理请求/响应序列化/反序列化,以正确的格式(json或xml)。你不需要特别处理(任何代码),除非你正在做一些额外的工作,我认为这不是问题所在。我在我的函数中写了这个,现在返回类型不匹配。我不想更改返回类型…@muruge你说得很对..但问题是如何更改http头,在global.asax?@muruge啊,是的,听起来不错。我已经很久没有使用旧的web api了,谢谢提醒+1。用户-您的http头不是全局配置的,而是每个请求的处理。您可能希望在一个方法上使用text/plain,在另一个方法上使用text/xml或application/json。正如muruge所说,如果您只是删除ResponseFormat.XML,Http头应该根据请求接受头自动设置为适当的类型。问题是我们应该在哪里写入此i-e内容类型和头?发送请求时,头应该在客户端设置。我将编辑我的答案以展示如何实现这一点。您认为人们会使用fiddler查看输出吗?此外,我如何在fiddler中看到响应?fiddler是调试web服务的一个很好的工具。就我个人而言,我认为它是开发应用程序中间层组件的开发人员必须拥有的工具之一。要回答您的问题-您可以转到Inspectors选项卡查看响应。@user1391118:向我们显示您试用过的代码,以便我们帮助您修复它。
        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>();