繁体   English   中英

WCF奇怪的行为:application / xml但请求中包含JSON正文

[英]WCF odd behavior: application/xml but JSON body in request

我定义了一个端点:

[ServiceContract]
interface IRequestStuff
{
    [OperationContract]
    [WebInvoke(UriTemplate = "token", Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
    ResponseData RequestStuff(RequestData request);
}

我这样称呼它:

using (var f = new WebChannelFactory<IRequestStuff>(new Uri("http://myhost/TestService/RequestStuff.svc")))
{
    var request = new RequestData()
    {
        Member1 = "Member 1",
        Member2 = "Member 2"
    };

    var response = f.CreateChannel().RequestStuff(request);
}

我还在指定位置有一个侦听Web服务终结点。 当我尝试从测试应用程序拨打电话时,一切正常。 但是,当我从另一个Web服务内部调用RequestStuff时,该请求具有最奇怪的东西-它具有“ Content-Type:application / xml”,但是主体为JSON {“ Member1”:“ Member 1”,“ Member2” :“成员2”}。

端点自然会返回Bad Request,因为该请求的格式不正确。

这里发生了什么?

如果使用的是WCF 4.0,则可以启用WebHttpBehavior automaticFormatSelectionEnabled属性。 请查看以获取更多详细信息。

事实证明,在这种特殊情况下,我必须创建一个新的OperationContextScope来放置出站请求。 可能是因为调用方和被调用的服务位于同一主机上。

using (var f = new WebChannelFactory<IRequestStuff>(new Uri("http://myhost/TestService/RequestStuff.svc")))
{
    var request = new RequestData()
    {
        Member1 = "Member 1",
        Member2 = "Member 2"
    };

    var intf = f.CreateChannel();

    using (new OperationContextScope((IContextChannel)intf))
    {
        var response = intf.RequestStuff(request);
    }
}

只需从WebInvoke属性中删除RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json 如上所述,还启用自动格式选择可能会很有用:

f.Endpoint.Behaviors.Add(new WebHttpBehavior
{
     AutomaticFormatSelectionEnabled = true
});
var intf = f.CreateChannel();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM