Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.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# WCF REST服务在使用自定义绑定时未传递POST请求正文流_C#_.net_Wcf_Web Services - Fatal编程技术网

C# WCF REST服务在使用自定义绑定时未传递POST请求正文流

C# WCF REST服务在使用自定义绑定时未传递POST请求正文流,c#,.net,wcf,web-services,C#,.net,Wcf,Web Services,从我问的前一个问题的解决方案开始跟进。现在我似乎遇到了一个问题,如果我在.NET4 web服务中使用自定义绑定,那么当实现web服务WebInvoke契约的方法包含请求主体流的参数时,它们就不再被调用 下面是从上面的链接中找到的运行Web服务的代码: webserviceHost = new WebServiceHost(typeof(Service1), new Uri("http://localhost:8080)); webserviceHost.AddServiceEndpoint(ty

从我问的前一个问题的解决方案开始跟进。现在我似乎遇到了一个问题,如果我在.NET4 web服务中使用自定义绑定,那么当实现web服务WebInvoke契约的方法包含请求主体流的参数时,它们就不再被调用

下面是从上面的链接中找到的运行Web服务的代码:

webserviceHost = new WebServiceHost(typeof(Service1), new Uri("http://localhost:8080));
webserviceHost.AddServiceEndpoint(typeof(IService), getBinding(), "webservice").Behaviors.Add(new WebHttpBehavior());
webserviceHost.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
webserviceHost.Open();
以下是定义的WebInvoke服务契约:

[WebInvoke(UriTemplate = "import_data?param={value}", Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
WebResult importOrder(string value, Stream httpRequestPostBody);
以下是执行上述合同的方法:

public WebResult importOrder(String value, Stream httpRequestPostBody)
{
    doSomething(value, httpRequestPostBody);
}

因此,如果我尝试通过Fiddler向webservice端点契约发出HTTP请求,它将返回连接重置HTTP错误响应。如果我删除Stream-httpRequestPostBody参数,那么它将运行该方法,但我无法访问请求体中的原始JSON数据(我可以获取体,但它是XML格式的)。因此,我只能收集我的自定义绑定中缺少的东西,以确保请求的主体流可以被传递。有人找到线索了吗?

所以我能想到的唯一答案是从契约中删除流,然后使用.NET的DataContractJsonSerializer将HTTP请求正文消息从XML转换回JSON。如下图所示

合同:

[WebInvoke(UriTemplate = "import_data?param={value}", Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
WebResult importOrder(string value);
实施:

public WebResult importOrder(String value){
    MyObject myObject = (MyObject)new DataContractJsonSerializer(typeof(MyObject)).ReadObject(OperationContext.Current.RequestContext.RequestMessage.GetReaderAtBodyContents());

    doSomething(value, myObject);
}
此解决方案并不理想,因为消息正在从原始数据转换为JSON,从XML转换为MyObject,而且还不允许我轻松使用更好的第三方JSON解析器并控制如何从传入数据初始化对象。 如果有人有更好的解决办法,我洗耳恭听