2011-08-18 74 views
1

我創建了一個WCF服務並通過工作角色將其託管在雲中。不幸的是,當我嘗試連接到輔助角色服務時,出現以下消息: 「主機3a5c0cdffcf04d069dbced5e590bca70.cloudapp.net沒有DNS條目。」 3a5c0cdffcf04d069dbced5e590bca70.cloudapp.net是在Azure臨時環境中部署的輔助角色的地址。 的workerrole.cs具有下面的代碼暴露WCF服務:無法連接到工作角色託管的WCF服務

public override void Run() 
    { 
     using (ServiceHost host = new ServiceHost(typeof(MyService))) 
     { 
      string ip = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["tcppoint"].IPEndpoint.Address.ToString(); 
      int tcpport = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["tcppoint"].IPEndpoint.Port; 
      int mexport = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["mexinput"].IPEndpoint.Port; 

      // Add a metadatabehavior for client proxy generation 
      // The metadata is exposed via net.tcp 
      ServiceMetadataBehavior metadatabehavior = new ServiceMetadataBehavior(); 
      host.Description.Behaviors.Add(metadatabehavior); 
      Binding mexBinding = MetadataExchangeBindings.CreateMexTcpBinding(); 
      string mexlistenurl = string.Format("net.tcp://{0}:{1}/MyServiceMetaDataEndpoint", ip, mexport); 
      string mexendpointurl = string.Format("net.tcp://{0}:{1}/MyServiceMetaDataEndpoint", RoleEnvironment.GetConfigurationSettingValue("Domain"), 8001); 
      host.AddServiceEndpoint(typeof(IMetadataExchange), mexBinding, mexendpointurl, new Uri(mexlistenurl)); 

      // Add the endpoint for MyService 
      string listenurl = string.Format("net.tcp://{0}:{1}/MyServiceEndpoint", ip, tcpport); 
      string endpointurl = string.Format("net.tcp://{0}:{1}/MyServiceEndpoint", RoleEnvironment.GetConfigurationSettingValue("Domain"), 9001); 
      host.AddServiceEndpoint(typeof(IMyService), new NetTcpBinding(SecurityMode.None), endpointurl, new Uri(listenurl)); 
      host.Open(); 

      while (true) 
      { 
       Thread.Sleep(100000); 
       Trace.WriteLine("Working", "Information"); 
      } 
     } 
    } 

的tcppoint和mexinput配置了端口8001和9001同樣域配有輔助角色的部署網址:3a5c0cdffcf04d069dbced5e590bca70.cloudapp.net

在客戶端部(一個控制檯應用程序)中,我們使用在的app.config ::

<bindings> 
     <netTcpBinding> 
      <binding name="NetTcpBinding_IMyService" closeTimeout="00:01:00" 
       openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
       transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" 
       hostNameComparisonMode="StrongWildcard" listenBacklog="10" 
       maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10" 
       maxReceivedMessageSize="65536"> 
       <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
        maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
       <reliableSession ordered="true" inactivityTimeout="00:50:00" 
        enabled="false" /> 
       <security mode="None"> 
        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" /> 
        <message clientCredentialType="Windows" /> 
       </security> 
      </binding> 
     </netTcpBinding> 

    </bindings> 
    <client> 
     <endpoint address="httpp:\\3a5c0cdffcf04d069dbced5e590bca70.cloudapp.net:9001/MyServiceEndpoint" binding="netTcpBinding" 
     bindingConfiguration="NetTcpBinding_IMyService" contract="ServiceReference1.IMyService" 
     name="NetTcpBinding_IMyService" /> 
    </client> 

    <behaviors> 
    <serviceBehaviors> 
     <behavior name="behave"> 
     <serviceMetadata httpGetEnabled="false"/> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 

</system.serviceModel> 
<system.net> 
    <defaultProxy useDefaultCredentials="true"> 
    <proxy autoDetect="False" usesystemdefault="False" bypassonlocal="True" /> 
</defaultProxy> 
以下配置

以下代碼是使用msdn中可用的示例代碼作爲背景構建的。本地它工作正常。不幸的是,當我將其部署到雲時,發生異常。此外,當我使用虛擬IP而不是URL時,會發生連接超時,但遠程計算機沒有響應。

+0

你的ServiceDefinition.csdef說什麼?它是否在端口9001上公開外部端點作用?如果您將ServiceDefinition.csdef的內容粘貼到您的問題中,這將有所幫助。 –

+0

服務定義代碼如下所示::

回答

0

看起來像你有你的服務設置來監聽net.tcp(TCP)和你的客戶端使用http綁定。我不希望即使在當地也能工作。我假設你已經在ServiceDefinition中打開了端口9000。請記住,這將是一個負載平衡端點。您是否試圖從部署(角色間)或雲外部與此實例通信?

我發現通過代碼設置主機和客戶端(在角色內通信時)要容易得多。試試這個:

http://dunnry.com/blog/2010/05/28/HostingWCFInWindowsAzure.aspx

如果你正試圖從一個客戶打服務部署外,這仍然適用,但對於客戶建築物的一部分。您將需要使用ServiceDefinition中定義的外部DNS名稱和端口。

如果您在角色準備好之前嘗試點擊端點太早,我也看到了DNS錯誤。可能需要一點時間來傳播DNS,並且您應該嘗試在解決問題之前解決它,以免緩存一個虛假的DNS條目。如果您可以將該DNS名稱解析爲您的VIP地址,那不是問題。

-2
public void CallWebService(string data) 
    { 

     try 
     { 
      string uri = "url"+data; 

      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri); 

      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

      Stream str = response.GetResponseStream(); 

      StreamReader sr = new StreamReader(str); 

      String IResponse = sr.ReadToEnd(); 


     } 
     catch (Exception ex) 
     { 
      System.Console.WriteLine("Message: "+ex.Message); 
     } 

    } 

希望它可以幫助你。

相關問題