2011-12-02 36 views
8

總之
如何在Azure上的IIS中託管時在本地主機上訪問WCF服務? Azure不會將localhost或127.0.0.1綁定到我的網站。在Azure上的Localhost上使用WCF

詳細信息
我有一個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中的網站沒有獲取到本地主機的綁定,而是綁定始終是服務器的實際IP地址。 它結束了在尋找的applicationHost.config這樣的:我的web應用程序試圖調用(爲此事或127.0.0.1)在本地主機上的服務它立即失敗,儘快

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

所以,。不用說,如果我使用服務器並更改綁定,那麼一切都很好。

我覺得很奇怪的是,在那裏人們在Azure的本地主機上訪問WCF服務的例子很多,所以我不明白爲什麼會這樣。我已將osFamily設置爲2,並且爲了調試此功能,我已啓用網絡發佈和遠程桌面訪問,我想在理論上可能會搞砸了。

我已經看過

  • 我可以在運行時在我的代碼重寫端點地址來代替本地主機的實際地址或動態創建端點作爲答案由Ron描述。不幸的是我使用WCF路由服務,所以我可以版本化工作流程。這意味着我的代碼調用了路由器端點,並且WCF路由器輪流使用web.config中指定的端點調用實際的服務/工作流。我沒有沒有,我覺得在路由服務端點解決方案的控制,編寫了一整套路由剛剛似乎是一個大量的工作時,我要的是調用邏輯的本地主機:)
  • 切換到使用命名管道;唉,它會導致工作流程中出現一些奇怪的問題,這可能是由於雙面打印造成的,而且我正處於截止日期之前,所以沒有時間在一分鐘內達到最低限度。

回答

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:"} 
} 

現在,這允許我使用http://127.0.0.1:8080/service.svc訪問我的服務。

注意:您確實需要按照食譜設定較高的執行環境,改變PowerShell執行模式的休息,所以就跟着它仔細

+0

任何人都可以說,爲什麼這個心不是結合已有在創建角色時? – BozoJoe

4

你必須動態地構建端點地址。

步驟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)); 
+0

謝謝羅恩。我做了類似這樣的事情,雖然它在我的代碼調用服務時正常工作,但我使用WCF路由服務,但無法(輕鬆地)控制路由服務如何創建端點,因此必須依賴Web中的內容。配置。儘管對一般情況很好的回答,並證實我並不瘋狂,所以+1。 – Frans