SOAP/MTOM: vs生成的代理类和处理PDF附件的问题
本文关键字:处理 PDF 问题 代理 MTOM vs SOAP | 更新日期: 2023-09-27 18:17:13
背景信息:用c#构建一个使用web服务的客户端。使用svcutil自动生成代理类。web服务设置为通过MTOM发送PDF附件,当我使用来自代理的API调用尝试这样做时,我得到以下错误:
Client found response content type of 'multipart/related; boundary="MIMEBoundaryurn_uuid_5D7E9AC12266BFFBDB1370543444063"; start-info="text/xml"; type="text/xml"; start="<0.urn:uuid:5D7E9AC12266BFFBDB1370543444064@apache.org>"', but expected 'text/xml'.
…我发现这意味着客户机没有为MTOM正确配置。很好,这里有一些如何修改配置的例子。不过,这就是我出错的地方——到目前为止,我发现的所有示例都将配置文件映射为与我的设置方式不同的配置文件。示例在system.serviceModel
部分中设置了两个项,一个用于绑定,另一个用于客户机端点,其中包含端点地址。我的自动生成配置将地址放入applicationSettings
,并且,好吧,我很困惑。(它们并排在一起:
例子:
<?xml version="1.0"?>
<configuration>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IUpload" messageEncoding="Mtom"/>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost/ServiceModelSamples/service.svc" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IUpload" contract="IUpload">
</endpoint>
</client>
</system.serviceModel>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
我:<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=----------------" >
<section name="TWS.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=----------------" requirePermission="false" />
</sectionGroup>
</configSections>
<applicationSettings>
<TWS.Properties.Settings>
<setting name="TWS_WebService_WsApiService" serializeAs="String">
<value>https://www.<redacted>.com/services/WsApiService/</value>
</setting>
</TWS.Properties.Settings>
</applicationSettings>
</configuration>
下面是如何在代理类中设置API调用本身:
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://localhost:8080/getStiDoc", RequestNamespace="http://www.<redacted>.com/ws/schemas", ResponseNamespace="http://www.<redacted>.com/ws/schemas", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
[return: System.Xml.Serialization.XmlElementAttribute("doc", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, DataType="base64Binary", IsNullable=true)]
public byte[] getDoc([System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)] string username, [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, DataType="integer", IsNullable=true)] string id) {
object[] results = this.Invoke("getDoc", new object[] {
username,
id});
return ((byte[])(results[0]));
}
我的问题是:如何设置我的配置文件,我应该如何添加适当的绑定,以确保它寻找MTOM而不是base64二进制?
终于自己找到了答案。为了正确设置代理类(即以wcf兼容的形式),我必须通过命令行使用svcutil将WSDL转换为代理类。这样做之后,我就可以将消息绑定设置为MTOM了。我仍然在使用证书进行身份验证时遇到麻烦,但这是一个较小的问题。