4

我对 SoapExtension 的配置有问题(与实现无关)。首先,我已经阅读了所有这些与 SoapExtensions 有某种关联的帖子(其中包括):

  1. 在客户端拦截来自和发往 Web 服务的 SOAP 消息
  2. https://www.codeproject.com/Articles/34381/Efficient-Tracing-Using-SOAP-Extensions-in-NET
  3. https://social.msdn.microsoft.com/Forums/en-US/d8d6fe09-74be-4210-91bb-a8924a742e8c/how-to-log-soap-message-which-is-going-out-of-my-网络应用程序?论坛=ncl
  4. http://www.seanmcilvenna.com/2010/08/20/logging-full-soap-messages/
  5. 如何创建 web.config 文件以加载 SoapExtension?
  6. 在 WCF 客户端中拦截消息
  7. https://msdn.microsoft.com/en-us/library/esw638yk(VS.85).aspx
  8. https://social.msdn.microsoft.com/Forums/en-US/1ba267b8-c08d-4c30-a1e1-792bac92fc87/soapextension-does-not-work-in-client-side?forum=netfxnetcom
  9. SoapExtension 未加载

场景如下:

  • 我正在从库(dll)项目中使用第 3 方 WS(SOAP):connectors.dll

  • 在这个项目中,我有一个对第 3 方 WS(SOAP) 的网络引用。我使用 VS 生成了代理(添加了 Web 引用,并指向 wsdl)。

  • 另一方面,我有一个 Web 应用程序(实际上是一个 REST 服务),它引用了 connector.dll 的一个类(我们可以称之为 Connector-A)

(直到这里,我通过我的 REST-Service webapp 调用了一个休息服务,调用了连接器-A,这对 3rdParty 的代理服务进行了最后一次调用。我收到了一个响应,但它的字符无效(位置为 0x1F 1),这就是为什么我试图使用 SoapExtension -> 在反序列化发生之前将其删除)

最后一步,配置: * 在我的 REST-Service (webapp) 中添加一个引用 (VS->Add Reference) 到 Backend.SoapExtnsions.dll 和

  • 在 web.config 中注册soapExtension:

`

<system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" maxUrlLength="4000" />
    <authentication mode="None" />
    <webServices>
    <soapExtensionTypes>
        <add type="Backend.SoapExtensions.XmlCleanupSoapExtension, Backend.SoapExtensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=66269ab3fc862c8f" priority="1" group="0" />
        </soapExtensionTypes>
    </webServices>
    <globalization uiCulture="auto:es" culture="auto:es-ES" enableClientBasedCulture="true" />
</system.web>

`

当我调用一个休息服务时,它最后调用了 WS-Soap,我现在得到了一个运行时异常,这让我抓狂:

The value of the property 'type' cannot be parsed. The error is: Could not load type 'Offidesk.Backend.SoapExtensions.XmlCleanupSoapExtension' from assembly 'Offidesk.Backend.SoapExtensions'.

我想我已经为这条线尝试了所有可能的组合:

<add type="Backend.SoapExtensions.XmlCleanupSoapExtension, Backend.SoapExtensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=66269ab3fc862c8f" priority="1" group="0" />

  • 有和没有程序集名称
  • 有和没有命名空间
  • 有和没有版本、文化和 PublicToken
  • 组=“0”和组=“高”

实际上,我对这个运行时异常感到非常沮丧。我虽然可能块内部的位置可能会影响,但我所有的尝试都得到了同样的例外......

任何想法??

提前致谢。

注意:我还尝试了其他技术来清理覆盖 SoapHttpClientProtocol(在扩展类中)方法的服务器响应:GetReaderForMessage,但对我也不起作用(不知道为什么)。

编辑

最后,无效字符 0x1F 的问题并非如此。我没有意识到响应是用 gzip 压缩的,并且代理客户端试图将压缩响应解析为 XML,这显然在运行时引发了异常。

但是,我很想知道为什么我的 web.config 和soap 扩展不起作用(迟早我们会需要这个配置......所以最好防止)。

4

2 回答 2

3

对于像我这样登陆这里的 Google 员工,如果您的 soap 扩展程序与使用它的项目不同,那么您的 app/web.config 中“type”的预期格式是“ namespace.class, project ”。

根据您做错了什么,错误消息会略有不同。

如果错误是“Could not load type 'MyType' from assembly 'System.Web.Webservices ...”,则逗号后没有第二部分——带有soap扩展的项目。它希望在System.Web.Webservices中找到您的类作为默认值,这当然不是您拥有它的地方。

如果错误只是“无法加载文件或程序集'MyProject'或其依赖项之一......”,则表示逗号后的第二部分错误而不是丢失。

  • 确保您实际上在您尝试使用它的项目中引用了soap 项目。
  • 确保在 app/web.config 中正确命名它。不要假设它只是命名空间的第一部分。在解决方案资源管理器中,转到包含您的 app/web.config 的项目的引用,右键单击您尝试引用的项目并查看属性。您想在逗号后放入 app/web.config 的值位于“身份”字段中。
于 2018-08-16T18:57:36.613 回答
1

我遇到了类似的问题,但 Chad Hedgcock 的回答极大地帮助了我。我的 SopaExtension 与我的 WebService 在同一个项目中。当我尝试在web.config中注册它时,我遇到了所有这些错误,但是当我将 SoapExtension 移动到一个新项目时,它就开始工作了(我只需要更改类型字段以包含新项目名称)。

于 2018-08-17T16:08:57.777 回答