在Azure上的Localhost上使用WCF

Fra*_*ans 8 wcf azure workflow-foundation-4

总结
如何在Azure上的IIS中托管时如何在localhost上访问WCF服务?Azure不会将localhost或127.0.0.1绑定到我的网站.

详细信息
我在Azure上托管了一个ASP.Net应用程序.我添加了一个.svc和一些我想通过WCF使用的工作流程.为了简单起见,我的网络应用程序只是在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>
Run Code Online (Sandbox Code Playgroud)

这在我的本地机器上工作得很好.问题是,当我将此发布到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>
Run Code Online (Sandbox Code Playgroud)

因此,只要我的Web应用程序尝试在localhost(或127.0.0.1)上调用该服务,它就会立即失败.不用说,如果我转到服务器并更改绑定,那么一切都很好.

我发现很奇怪的是,有很多例子,人们在Azure上的localhost上访问WCF服务,所以我无法弄清楚为什么会这样.我已经将osFamily设置为2并且为了调试这个我启用了Web发布和远程桌面访问,我认为理论上可能会搞砸了.

我已经看过了什么

  • 我可以在运行时重写代码中的端点地址,用localhost代替实际地址,或者如Ron在答案中所描述的那样动态创建端点.不幸的是我正在使用WCF路由服务,因此我可以对工作流进行版本控制.这意味着我的代码调用路由器端点,而WCF路由器依次使用web.config中指定的端点调用实际的服务/工作流.我没有控制路由服务端点解析,我认为,编写一整套路由逻辑,当我想要的只是调用localhost时,这似乎是很多工作.
  • 切换到使用命名管道; 唉,它会导致工作流程出现一些奇怪的问题,可能是由于双工,而且我处于截止日期,所以没有时间在那一刻到达底层.

Fra*_*ans 1

好吧,这就是我解决它的方法。恕我直言,这是一个黑客,但至少它有效。

基本上,我需要添加一个“*”绑定,这样我就可以在 Powershell 中执行此操作。一般配方在这里:http://blogs.msdn.com/b/tomholl/archive/2011/06/28/hosting-services-with-was-and-iis-on-windows-azure.aspx

这涉及添加命名管道支持,但原理是相同的。我刚刚将 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:"}
}
Run Code Online (Sandbox Code Playgroud)

现在我可以使用http://127.0.0.1:8080/service.svc来访问我的服务。

注意:您确实需要按照本教程的其余部分来设置提升的执行上下文并更改 powershell 执行模式,因此请仔细遵循