在Azure上的本地主机上使用WCF

在Azure上的本地主机上使用WCF,wcf,azure,workflow-foundation-4,Wcf,Azure,Workflow Foundation 4,总之 当托管在Azure上的IIS中时,如何在localhost上访问WCF服务?Azure未将localhost或127.0.0.1绑定到我的网站 详细信息 我有一个ASP.Net应用程序托管在Azure上。我添加了一个.svc和一些我想通过WCF使用的工作流。为了简单起见,我的web应用程序只是调用localhost上的服务,所以我在web.config中有这样的端点 <client> <endpoint address="http://localhost:8080/R

总之
当托管在Azure上的IIS中时,如何在localhost上访问WCF服务?Azure未将localhost或127.0.0.1绑定到我的网站

详细信息
我有一个ASP.Net应用程序托管在Azure上。我添加了一个.svc和一些我想通过WCF使用的工作流。为了简单起见,我的web应用程序只是调用localhost上的服务,所以我在web.config中有这样的端点

<client>
  <endpoint address="http://localhost:8080/Router.svc/Case" binding="basicHttpBinding" contract="NewOrbit.ExVerifier.Model.Workflow.Case.ICaseWorkflow" name="Case" />
  <endpoint address="http://localhost:8080/Workflow/Case/Case_default1.xamlx" binding="basicHttpBinding" contract="*" name="Case_default1" />
</client>

这在我的本地机器上运行得很好。问题是,当我将此发布到Azure时,IIS中的网站没有绑定到localhost,而是始终绑定到服务器的实际IP地址。 它在applicationHost.config中的最终外观如下所示:

<bindings>
   <binding protocol="http" bindingInformation="10.61.90.44:80:" />
   <binding protocol="https" bindingInformation="10.61.90.44:443:" />
   <binding protocol="http" bindingInformation="10.61.90.44:8081:" />
</bindings>

因此,只要我的web应用尝试调用localhost上的服务(或127.0.0.1),它就会立即失败。 不用说,如果我将rdp连接到服务器并更改绑定,那么一切都很好

我发现非常奇怪的是,有很多例子表明人们在Azure上访问localhost上的WCF服务,所以我不明白为什么会这样。我已经将osFamily设置为2,为了调试它,我启用了web发布和远程桌面访问,理论上,我想这可能会把事情搞砸

我已经看过的

  • 我可以在运行时重写代码中的端点地址,以用localhost替换实际地址,或者按照Ron在回答中所述动态创建端点。不幸的是,我使用的是WCF路由服务,因此我可以对工作流进行版本设置。这意味着我的代码调用路由器端点,WCF路由器使用web.config中指定的端点依次调用实际的服务/工作流。我认为,如果不编写一整套路由逻辑,我就无法控制路由服务端点解析,而当我只想调用localhost时,这似乎需要大量的工作:)
  • 切换到使用命名管道;唉,它在工作流程中引起了一些奇怪的问题,可能是由于双工,而我正处于最后期限,所以现在还没有时间来弄清这一点
      好的,我就是这样解决的。我知道这是一个黑客,但至少它是有效的

      基本上,我需要添加一个“*”绑定,这样我就可以在Powershell中完成这项工作。一般做法如下:

      这涉及添加命名管道支持,但原理相同。我刚刚将Powershell脚本更改为:

      import-module WebAdministration
      # Set up a binding to 8080 for the services 
      Get-WebSite "*Web*" | Foreach-Object { 
        $site = $_;
        $siteref = "IIS:/Sites/" + $site.Name;
        New-ItemProperty $siteref -name bindings -value @{protocol="http";bindingInformation="*:8080:"}
      }
      
      这现在允许我使用访问我的服务


      注意:您确实需要遵循配方的其余部分来设置提升的执行上下文并更改powershell执行模式,因此请务必仔细遵循此步骤。您必须动态构建端点地址

      第1步: 在ServiceDefinition.csdef中,需要声明端点

      <ServiceDefinition name="MyFirstAzureWorkflow" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
        <WebRole name="WorkflowWeb" vmsize="ExtraSmall">
          <Sites>
            <Site name="Web">
              <Bindings>
                <Binding name="Endpoint1" endpointName="WorkflowService" />
              </Bindings>
            </Site>
          </Sites>
          <Endpoints>
            <InputEndpoint name="WorkflowService" protocol="http" port="80" />
          </Endpoints>
          <Imports>
            <Import moduleName="Diagnostics" />
          </Imports>
        </WebRole>
      </ServiceDefinition>
      

      谢谢你,罗恩。我做了类似的事情,虽然当我的代码调用该服务时它可以正常工作,但我使用WCF路由服务,无法(轻松)控制路由服务如何创建端点,因此必须依赖web.config中的内容。不过,对一般情况的回答很好,并且证实了我不是疯狂的so+1。有人能说一下为什么在创建角色时这个绑定还不可用吗?
      var endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["WorkflowService"].IPEndpoint;
      var uri = new Uri(string.Format(
          "http://{0}:{1}/MyService.xamlx",
          endpoint.Address,
          endpoint.Port));
      var proxy = new ServiceClient(
          new BasicHttpBinding(),
          new EndpointAddress(uri));