WCF:具有不同内容类型的请求/响应
Posted
技术标签:
【中文标题】WCF:具有不同内容类型的请求/响应【英文标题】:WCF: request/response with different content types 【发布时间】:2021-12-04 17:47:50 【问题描述】:我正在尝试使用 .NET 5 中的 WCF 使用 SOAP 服务。服务提供者希望请求的内容类型为 text/xml
,但发送内容类型为 application/xml
的响应。
以下代码抛出 ProtocolException
,因为它期望请求和响应都具有内容类型 text/xml
。
var binding = new BasicHttpBinding();
var endpoint = new EndpointAddress("http://[...]/inquiry");
var channelFactory = new ChannelFactory<InquiryServiceSoapPort>(binding, endpoint);
var serviceClient = channelFactory.CreateChannel();
var inquiry = new Inquiry();
var result = serviceClient.createInquiry(inquiry);
我能够使用custom encoder 将内容类型更改为application/xml
,但这会同时更改请求和响应,然后我的请求被服务器拒绝。
有没有办法只改变响应的内容类型?
编辑
请注意,我正在编写客户端代码,而不是服务器端代码。到目前为止,我似乎只能捕获并吞下异常,或者使用另一个框架或从头开始重新实现代码。
【问题讨论】:
“我正在尝试使用 .NET 5 中的 WCF 使用 SOAP 服务” - 你有我的同情 出于好奇,您是否有使用(非常不符合人体工程学的)旧的 .NET WCF 客户端代码?如果这仅适用于少数 SOAP 端点,您可以使用您自己的逻辑对HttpClient
进行破解。
你可以看看this case,也许对你有帮助。
【参考方案1】:
在此处查看 WCF 架构: https://docs.microsoft.com/en-us/dotnet/framework/wcf/architecture
所以我们有 WCF 的 ABC 是 Address、Binding 和 Contract,这里我们在合约序列化中 https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/data-transfer-and-serialization
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/data-contract-serializer
详细说明: https://docs.microsoft.com/en-us/dotnet/api/system.runtime.serialization.datacontractserializer?view=net-5.0
这是我建议深入研究的概念,http 标头类型“content-type”实际上是其余部分的函数,以防您进行 BasicHttp 绑定 https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.basichttpbinding?view=dotnet-plat-ext-5.0
这只是 WCF 中可用的更大工具的一角。例如 wsHttpBinding 在许多情况下确实更可取,如果端点可用,它可以单独解决您的问题。
在wsHttpBinding中可以控制消息编码 https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/wcf/wshttpbinding
最终选择您的消息编码器将决定如何设置标头,与 REST io 模型相比,有很多抽象级别,但它就在那里: https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/choosing-a-message-encoder
你甚至可以滚动你自己的。
【讨论】:
以上是关于WCF:具有不同内容类型的请求/响应的主要内容,如果未能解决你的问题,请参考以下文章
响应消息的内容类型application/xml;charset=utf-8 与绑定的内容类型(text/xml;charset=utf-8)不匹配,WCF
在 WCF Azure 服务总线中动态分配 json 响应内容类型
应用程序/json内容类型请求的Restful WCF POST问题