gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:28:31 24 4
gpt4 key购买 nike

总结
当托管在 Azure 上的 IIS 中时,如何访问本地主机上的 WCF 服务? Azure 未将 localhost 或 127.0.0.1 绑定(bind)到我的网站。

详情
我有一个托管在 Azure 上的 ASP.Net 应用程序。我添加了一个 .svc 和一些我想通过 WCF 使用的工作流程。为了简单起见,我的 Web 应用程序只需调用本地主机上的服务,因此我在 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 中的网站没有绑定(bind)到本地主机,而是始终绑定(bind)到服务器的实际 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>

因此,一旦我的网络应用程序尝试调用本地主机(或 127.0.0.1)上的服务,它就会立即失败。不用说,如果我 rdp 到服务器并更改绑定(bind),那么一切都很好。

我发现真正奇怪的是,有大量的例子表明人们在 Azure 上的本地主机上访问 WCF 服务,所以我不明白为什么会这样。我已经设置了osFamily 到 2,为了调试这个,我启用了 Web 发布和远程桌面访问,我想,理论上,这可能会把事情搞砸。

我已经看过的内容

  • 我可以在运行时重写代码中的端点地址,以用 localhost 替换实际地址,或者按照 Ron 在答案中所述动态创建端点。不幸的是,我正在使用 WCF 路由服务,因此我可以对工作流进行版本控制。这意味着我的代码调用路由器端点,而 WCF 路由器又使用 web.config 中指定的端点调用实际的服务/工作流。我认为,如果不编写一整套路由逻辑,我就无法控制路由服务端点解析,当我只想调用 localhost 时,这似乎是一项繁重的工作:)
  • 切换到使用命名管道;唉,它会导致工作流程出现一些奇怪的问题,可能是由于双工造成的,而且我已经到了最后期限,所以目前没有时间深入了解这个问题。

最佳答案

您必须动态构建端点地址。

第 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>

第 2 步:当您想要调用该服务时

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

关于wcf - 在 Azure 上的本地主机上使用 WCF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8353348/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com