6

我有一个 Web 服务,它位于这样的反向代理后面:

反向代理

现在发生的事情是,当我尝试添加一个 Web 引用来测试 Web 服务时,它说它无法下载 wsdl 文件。那是因为当请求被发送时它是https://uat.mywebservice.com/Service/Service.asmx但是当它点击反向代理然后厌倦下载 wsdl 和 disco 文件时,它会将链接更改为http: //myservice.comp.com/Service/Service.asmx?wsdl这不是正确的链接,因为myservice.comp.com它只是反向代理上的名称空间。

发生的事情是soap文件中的标题正在更新到这个命名空间,而不是实际的主机名uat.mywebservice.com,我能够看到这个使用提琴手迪斯科文件的地址不正确。我通过使用 wsdl.exe 工具创建代理类来解决问题,然后将该类中所有不正确的链接更新为正确的主机名。

有什么方法可以确保在点击反向代理时地址保持正确。

不正确:   mywebservice.comp.com

<?xml version="1.0" encoding="utf-8" ?> 
<discovery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/disco/"> 
    <contractRef ref="http://mvwebservice.comp.com/Service/Service.asmx?wsdl" docRef="http://mvwebservice.comp.com/Service/Service.asmx" xmlns="http://schemas.xmlsoap.org/disco/scl/" /> 
    <soap address="http://mywebservice.comp.com/Service/Service.asmx" xmlns:q1="http://tempuri.org/" binding="q1:ServiceSoap" xmlns="http://schemas.xmlsoap.org/disco/soap/" /> 
    <soap address="http://mywebservice.comp.com/Service/Service.asmx" xmlns:q2="http://tempuri.org/" binding="q2:ServiceSoap12" xmlns="http://schemas.xmlsoap.org/disco/soap/" /> 
</discovery>

正确的:   uat.mywebservice.com

<?xml version="1.0" encoding="utf-8" ?> 
<discovery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/disco/"> 
    <contractRef ref="https://uat.mvwebservice.com/Service/Service.asmx?wsdl" docRef="https://uat.mvwebservice.com/Service/Service.asmx" xmlns="http://schemas.xmlsoap.org/disco/scl/" /> 
    <soap address="https://uat.mywebservice.com/Service/Service.asmx" xmlns:q1="http://tempuri.org/" binding="q1:ServiceSoap" xmlns="http://schemas.xmlsoap.org/disco/soap/" /> 
    <soap address="https://uat.mywebservice.com/Service/Service.asmx" xmlns:q2="http://tempuri.org/" binding="q2:ServiceSoap12" xmlns="http://schemas.xmlsoap.org/disco/soap/" /> 
</discovery>
4

1 回答 1

4

我为解决类似问题所做的是强制 Web 服务发出正确的标头。

您可以执行以下操作:

  1. 在文件夹中创建以下类App_Code

    using System;
    using System.Web.Services.Description;
    
    namespace Msdn.Web.Services.Samples
    {
      /// <summary> Summary description for WSDLReflector </summary>
      public class WSDLReflector : SoapExtensionReflector
      {
        public override void ReflectMethod()
        {
          //no-op
        }
    
        public override void ReflectDescription()
        {
          ServiceDescription description = ReflectionContext.ServiceDescription;
          foreach (Service service in description.Services)
          {
            foreach (Port port in service.Ports)
            {
              foreach (ServiceDescriptionFormatExtension extension in port.Extensions)
              {
                SoapAddressBinding binding = extension as SoapAddressBinding;
                if (null != binding)
                {
                  binding.Location = binding.Location.Replace("http://mywebservice.comp.com", "https://uat.mywebservice.com");
                }
              }
            }
          }
        }
      }
    }
    
  2. 并将其添加到web.config

    <webServices>
      <diagnostics suppressReturningExceptions="true" />
      <soapExtensionReflectorTypes>
        <add type="Msdn.Web.Services.Samples.WSDLReflector,App_Code"/>
      </soapExtensionReflectorTypes>
    </webServices>
    
于 2013-02-11T22:17:37.990 回答