2011-08-18 76 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); 
     } 

    } 

希望它可以帮助你。

相关问题