gpt4 book ai didi

c# - 使用自定义绑定(bind)时 WCF REST 服务不传递 POST 请求正文流

转载 作者:太空宇宙 更新时间:2023-11-03 16:24:46 27 4
gpt4 key购买 nike

继我提出的上一个问题的解决方案之后 here .我现在似乎遇到了一个问题,如果我在我的 .NET4 Web 服务中使用自定义绑定(bind),那么当我实现 Web 服务 WebInvoke 契约(Contract)的方法包含请求正文流的参数时,它们将不再被调用。

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

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 向 Web 服务端点合约发出 HTTP 请求,它将返回一个连接重置 HTTP 错误响应。如果我删除 Stream httpRequestPostBody 参数,那么它将运行该方法,但我无法访问请求正文中的原始 JSON 数据(我可以获取正文,但它是 XML 形式)。所以我只能收集到我在我的自定义绑定(bind)中遗漏了一些东西以确保可以传递请求的主体流。有人有任何线索吗?

最佳答案

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

契约(Contract):

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

这个解决方案并不理想,因为消息正在从 RAW 转换为 JSON,再转换为 XML,再转换为 MyObject,而且不允许我轻松使用更好的第 3 方 JSON 解析器并控制如何从传入数据初始化我的对象.如果有人有更好的解决方案,我会洗耳恭听。

关于c# - 使用自定义绑定(bind)时 WCF REST 服务不传递 POST 请求正文流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12908833/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com