在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));