Web配置设置不覆盖服务端点?

时间:2013-06-10 21:04:29

标签: .net soap web-config

我一直在试着弄清楚这里发生了什么......

我们正在尝试部署到服务器的应用程序,我们需要更改它消耗的SOAP服务的端点。最初添加服务时,它在Web配置文件中创建了一个条目:

<endpoint address="http://subdomain.example.com/path/to/mapserver" binding="basicHttpBinding" bindingConfiguration="MapServerBinding" contract="ServiceReference1.MapServerPort" name="MapServerPort" />

我们正在尝试将其更改为本地地址,以避免它在使用服务时退出互联网并返回(无论是效率还是防火墙问题):

<endpoint address="http://serverAlias/path/to/mapserver" binding="basicHttpBinding" bindingConfiguration="MapServerBinding" contract="ServiceReference1.MapServerPort" name="MapServerPort" />

在服务器上更改此配置值不会导致其查看位置发生变化,但仍会转到subdomain.example.com。

我尝试过的事情:

  • 创建一个运行相关代码位的控制台应用程序,然后在配置文件中更改其端点(按预期为该应用程序工作,并证明此服务器可以连接到SOAP服务)
  • IISReset(不起作用,配置值仍未兑现)
  • 更改Web配置中的其他内容以确保配置文件确实正在重新加载(我更改的每个设置都会影响行为,但端点更改除外)
  • 将相同的应用程序部署到类似的服务器(在DMZ,IIS 7.5中)并更改该实例的配置( 实例按预期更改)
  • 更改了hosts文件,将对subdomain.example.com的调用重定向到内部IP(这样可行,但感觉就像解决它的方法一样)
  • 重新启动服务器以查看是否可以清除它具有的任何神奇缓存(不会改变行为)

可能导致端点保持初始配置的任何想法?

以下是配置文件的更完整摘录(请注意,我们可以在其他服务器上随意更改端点地址,它只是生产服务器似乎忽略它)。根据Brian的建议,将所有绑定名称匹配为相同,最初[binding name =“”]和[endpoint bindingConfiguration =“”]都是“MapServerBinding”,否则它与原始配置相同。

  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="MapServerPort" />
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://serverAlias/path/to/mapserver"
        binding="basicHttpBinding" bindingConfiguration="MapServerPort"
        contract="ServiceReference1.MapServerPort" name="MapServerPort" />
    </client>
  </system.serviceModel>

2 个答案:

答案 0 :(得分:1)

这个东西更糟糕。我感觉到你的痛苦。这正是我必须实际获得服务引用以尊重生产服务器上的web.config设置: (另外,为了以防万一,请确保您没有防火墙问题,请考虑使用本地ips或编辑您的主机文件,如果您有,请在此处查看我的问题和答案:

Web Service Error "There was no endpoint listening at..." Firewall Concern

以下代码将尊重您的生产web.config,我只会使用自定义和基本绑定而不提问题,我不知道您是否需要两者但这是一个我不在乎的头发拉动场景:

vb.net

Dim offerService As ServiceReferenceOffer.OfferServiceSoapClient
 offerService = New ServiceReferenceOffer.OfferServiceSoapClient("OfferServiceSoap")

的web.config

     <system.serviceModel>
        <bindings>
          <basicHttpBinding>
            <binding name="OfferServiceSoap" />
       </basicHttpBinding>
      <customBinding>
            <binding name="OfferServiceSoap12">
              <textMessageEncoding messageVersion="Soap12" />
              <httpTransport />
            </binding>
     </customBinding>
        </bindings>
    <client>
     <endpoint address="http://serverAlias/path/to/mapserver/OfferService.asmx" binding="basicHttpBinding" bindingConfiguration="OfferServiceSoap" contract="ServiceReferenceOffer.OfferServiceSoap" name="OfferServiceSoap" />
          <endpoint address="http://serverAlias/path/to/mapserver/OfferService.asmx" binding="customBinding" bindingConfiguration="OfferServiceSoap12" contract="ServiceReferenceOffer.OfferServiceSoap" name="OfferServiceSoap12" />
        </client>
 </system.serviceModel>

答案 1 :(得分:0)

所以,这个问题的答案是更多地关注堆栈跟踪,虚拟 ...我知道我必须在某个地方丢失一些简单的东西,并且它最终会集中所有的我的努力在错误的地方。我一直在查看模型,代码中唯一一个服务引用我试图改变的位置...当控制器中有另一个调用 appsetting 配置条目,我完全失踪。

创建此代码的开发人员执行了以下操作:

<强>控制器

FooClass foo = new FooClass( configFileEntry["serviceRestURL"] );
return View(Models.bar(foo.fooMethod()));

<强>模型

using (BazServiceClient baz = new BazServiceClient("MapServerPort"))
{
  baz.GetSomeImportantInformation();
  //Do some more work here
}

因此,我们有两个不同的端点,服务器正在与之交谈(一个是控制器中基于REST的API,另一个是模型中基于SOAP的API)。由于基于REST的API隐藏在其他面向最终用户的REST URL中(这些是Web映射层服务,所以有一些其他的就像它一样)我最终专注于那个(我认为)的唯一一个服务器应该用于服务器到服务器的通信。

由于从服务器访问REST URL的防火墙限制,控制器在模型有机会执行之前引发了异常,因此未反映我的服务引用编辑。这也有助于解释为什么我添加的一些用于确保我的配置编辑被反映的工具似乎从未真正起作用。如果它有助于某人排除故障,我会粘贴我试图在下面使用的故障排除代码,以验证应用程序的服务引用视图与Web配置的服务引用相匹配。

        /*
         * This code is using (abusing?) the wonderful Elmah nuget package [ http://nuget.org/packages/elmah/ ] 
         * to surface the error in a way that is easy for me to find, so either install the package or swap it out
         * with your own way of surfacing the information.
         */
        System.ServiceModel.Configuration.ClientSection clientEndpoints = System.Configuration.ConfigurationManager.GetSection("system.serviceModel/client") as System.ServiceModel.Configuration.ClientSection;

        if (clientEndpoints != null)
        {
            //Loop through all the endpoints in the config to see what the config thinks it is set to
            foreach (System.ServiceModel.Configuration.ChannelEndpointElement endpoint in clientEndpoints.Endpoints)
            {
                string configFileMessage = "In Web config: [" + endpoint.Contract + "] points to [" + endpoint.Address.AbsoluteUri + "]";
                Elmah.ErrorSignal.FromCurrentContext().Raise(new Exception(configFileMessage));
            }

            //Now see what the application is actually registering when it instantiates the service.
            //If all is well in the .NET world, this should match the web config entry!
            using (MapServerPortClient client = new MapServerPortClient("MapServerPort"))
            {
                string endPointMessage = "In application: " + client.Endpoint.Address.ToString();
                Elmah.ErrorSignal.FromCurrentContext().Raise(new Exception(endPointMessage));
            }

        }
        else
        {
            Elmah.ErrorSignal.FromCurrentContext().Raise(new Exception("This is a bit embarrasing, but... I couldn't read the client endpoints at all.."));
        }