2015-09-12 20 views
6

Tôi có hai vai trò web và một trong số đó chạy lớp dịch vụ bao gồm 3 dịch vụ WCF được kết nối với net.tcp, mỗi dịch vụ được triển khai dưới dạng trang web trên cổng 808, 810 và 811.Điểm cuối nội bộ cho dịch vụ WCF không hoạt động trên vai trò Web Azure

Bây giờ tôi muốn lớp dịch vụ chỉ mở cho vai trò web khác của mình.

Vì vậy, tôi đã cố gắng thực hiện một trong các điểm cuối dịch vụ nội bộ và cấp quyền truy cập cho vai trò web phía trước của tôi.

Như thế này:

<ServiceDefinition name="MagnusAzureCloudService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2015-04.2.6"> <WebRole name="Core.Services" vmsize="Small"> <Runtime executionContext="elevated" /> <Startup> <Task commandLine="Startup/startup.cmd" executionContext="elevated" taskType="background" /> </Startup> <Sites> <Site name="Core" physicalDirectory="C:\CoreServices"> <Bindings> <Binding name="Endpoint1" endpointName="Endpoint1" /> </Bindings> </Site> <Site name="Store" physicalDirectory="C:\StoreServices"> <Bindings> <Binding name="Endpoint3" endpointName="Endpoint3" /> </Bindings> </Site> <Site name="Users" physicalDirectory="C:\UserServices"> <Bindings> <Binding name="Endpoint4" endpointName="Endpoint4" /> </Bindings> </Site> </Sites> <ConfigurationSettings> <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" /> </ConfigurationSettings> <Endpoints> <InputEndpoint name="Endpoint1" protocol="http" port="8282" /> <InputEndpoint name="Endpoint3" protocol="http" port="81" /> <InputEndpoint name="Endpoint4" protocol="http" port="8181" /> <InputEndpoint name="Endpoint2" protocol="tcp" port="808" localPort="808" /> <InputEndpoint name="Endpoint5" protocol="tcp" port="810" localPort="810" /> <InternalEndpoint name="Endpoint6" protocol="tcp" port="811" /> </Endpoints> <Certificates> </Certificates> <Imports> <Import moduleName="RemoteAccess" /> <Import moduleName="RemoteForwarder" /> </Imports> </WebRole> <WebRole name="UIWeb" vmsize="Small"> <Runtime executionContext="elevated" /> <Startup> <Task commandLine="Startup/startup.cmd" executionContext="elevated" taskType="background" /> </Startup> <Sites> <Site name="Web"> <Bindings> <Binding name="Endpoint1" endpointName="Endpoint1" /> </Bindings> </Site> </Sites> <ConfigurationSettings> <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" /> </ConfigurationSettings> <Endpoints> <InputEndpoint name="Endpoint1" protocol="http" port="80" /> </Endpoints> <Imports> <Import moduleName="RemoteAccess" /> </Imports> </WebRole> <NetworkTrafficRules> <OnlyAllowTrafficTo> <Destinations> <RoleEndpoint endpointName="Endpoint6" roleName="Core.Services" /> </Destinations> <WhenSource matches="AnyRule"> <FromRole roleName="UIWeb"/> </WhenSource> </OnlyAllowTrafficTo> </NetworkTrafficRules> </ServiceDefinition>

Nhưng khi UserService đang cố gắng có vẻ như thời gian ra.

Lỗi máy chủ trong ứng dụng '/'.

Kết nối với qua net.tcp: //myservicename.cloudapp.net: 811/UserTypeService.svc hết thời gian sau 00:00:00. Đã thực hiện các nỗ lực kết nối với 0 trong số 1 địa chỉ có sẵn (). Kiểm tra RemoteAddress của kênh của bạn và xác minh rằng bản ghi DNS cho điểm cuối này tương ứng với Địa chỉ IP hợp lệ. Thời gian được phân bổ cho hoạt động này có thể là một phần của thời gian chờ dài hơn .

Tôi cũng đã cố gắng đặt <AllowAllTraffic/> thay vì <WhenSource ...> nhưng điều đó không có hiệu lực.

Lần thử thứ hai: Sau một số phản hồi, tôi đã thử một số biến thể để đặt FixedPortPortRange thành 811 và vai trò nghe port="*".

<InternalEndpoint name="Endpoint6" protocol="tcp" port="*" > 
     <FixedPortRange min="811" max="811"></FixedPortRange> 
    </InternalEndpoint> 

Tôi đã lưu NetworkTrafficRules như trong các lần thử trước.

Tôi cũng đã thêm mã sau đây để đảm bảo có trình nghe cho một cổng động. Trong tệp WebRole.cs của tôi:

public class WebRole : RoleEntryPoint 
{ 
    /// <summary> 
    /// 
    /// </summary> 
    /// <returns></returns> 
    public override bool OnStart() 
    { 
     Trace.TraceInformation("OnStart method called. Updating information on IIS."); 

     try 
     { 
      // Initialize method-wide variables 
      var epName = "Endpoint6"; 
      var roleInstance = RoleEnvironment.CurrentRoleInstance; 

      // Identify direct communication port 
      var myPublicEp = roleInstance.InstanceEndpoints[epName].PublicIPEndpoint; 
      Trace.TraceInformation("IP:{0}, Port:{1}", myPublicEp.Address, myPublicEp.Port); 

      // Identify public endpoint 
      var myInternalEp = roleInstance.InstanceEndpoints[epName].IPEndpoint; 

      // Create socket listener 
      var listener = new Socket(
       myInternalEp.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 

      // Bind socket listener to internal endpoint and listen 
      listener.Bind(myInternalEp); 
      listener.Listen(10); 
      Trace.TraceInformation("Listening on IP:{0},Port: {1}", 
       myInternalEp.Address, myInternalEp.Port); 

      while (true) 
      { 
       // Block the thread and wait for a client request 
       Socket handler = listener.Accept(); 
       Trace.TraceInformation("Client request received."); 

       // Define body of socket handler 
       var handlerThread = new Thread(
        new ParameterizedThreadStart(h => 
        { 
         var socket = h as Socket; 
         Trace.TraceInformation("Local:{0} Remote{1}", 
       socket.LocalEndPoint, socket.RemoteEndPoint); 

         // Shut down and close socket 
         socket.Shutdown(SocketShutdown.Both); 
         socket.Close(); 
        } 
       )); 

       // Start socket handler on new thread 
       handlerThread.Start(handler); 
      } 
     } 
     catch (Exception e) 
     { 
      Trace.TraceError("Caught exception in run. Details: {0}", e); 
     } 
     // Set the maximum number of concurrent connections 
     ServicePointManager.DefaultConnectionLimit = 12; 

     return base.OnStart(); 
    } 
} 

Lưu ý khác là dịch vụ gọi sử dụng cổng 811 để tìm dịch vụ phù hợp do dịch vụ chạy ba trang dự án WCF khác nhau. Và dịch vụ tôi gọi cũng sử dụng một số cổng cụ thể mà tôi nghĩ rằng có thể là một vấn đề nếu tất cả của một đột ngột nên năng động. Dịch vụ gọi điện trông giống như sau:

<endpoint address="net.tcp://myservicename.cloudapp.net:811/UserTypeService.svc" 
     behaviorConfiguration="ClientContextEndpointBehavior" binding="netTcpBinding" 
     bindingConfiguration="NetTcpBinding_FrameworkService" contract="Users.Services.IPersonTypeService" 
     name="Tcp"> 
    <identity> 
     <dns value="The Certificate Name" /> 
    </identity> 
    </endpoint> 

Và trên trang web WebRole nhận (Nội bộ) Tôi có các loại cấu hình sau.

<service name="Core.Services.Logging.LoggingService" behaviorConfiguration="coreServiceBehavior"> 
<endpoint address="net.tcp://localhost:808/LoggingService.svc" 
       behaviorConfiguration="ContextEndpointBehavior" 
       binding="netTcpBinding" 
       bindingConfiguration="NetTcpBinding1" 
       contract="Core.Logging.ILoggingService"> 
     <identity> 
     <dns value="The Certificate Name" /> 
     </identity> 
    </endpoint> 

Và các trang web WCF khác trên cổng 811:

<service name="Users.Services.PersonTypeService"> 
<endpoint address="net.tcp://localhost:811/UserTypeService.svc" binding="netTcpBinding" bindingConfiguration="NetTcpServiceBinding1" behaviorConfiguration="ServerContextEndpointBehavior" contract="Users.Services.IUserTypeService"> 
    <identity> 
    <dns value="The Certificate Name" /> 
    </identity> 
</endpoint> 

<endpoint address="mex" binding="mexTcpBinding" kind="mexEndpoint"> 
    <identity> 
    <dns value="localhost" /> 
    </identity> 
</endpoint> 

Trả lời

0

Bạn có thể sử dụng các thiết bị đầu cuối nội địa chỉ IP và thay vì địa chỉ bên ngoài. Dưới đây là ví dụ:

foreach (RoleInstance roleInst in RoleEnvironment.CurrentRoleInstance.Role.Instances) 
{ 
    // Skip local role instance 
    if (RoleEnvironment.CurrentRoleInstance.Id == roleInst.Id) continue; 

    if (roleInst.Role.Name == "My Cool Role") 
    { 
     foreach (RoleInstanceEndpoint roleInstEndpoint in roleInst.InstanceEndpoints.Values) 
     { 
      // Get endpoint address using the internal endpoint's IP address 
      if (roleInstEndpoint.Protocol == "tcp") 
       SendRequest(roleInstEndpoint.IPEndpoint.Address.ToString(), command); 

     } 
    } 
} 
+0

Tôi không chắc mình đang theo dõi?Bạn đề nghị tôi làm gì và tại sao? –

+0

@MagnusKarlsson Bạn đang cố kết nối với một điểm cuối _internal_ bằng địa chỉ * external * myservicename.cloudapp.net vào dịch vụ của bạn, _Input endpoints_ được sử dụng để giao tiếp với các cá thể vai trò từ * outside * của Azure. _Internet endpoints_ được sử dụng cho * nội bộ * vai trò giao tiếp và sau đó bạn cần địa chỉ IP cho IP nội bộ-phạm vi đó là những gì mẫu mã của tôi không, Xem này để biết thêm thông tin https://msdn.microsoft.com/en-us/library /azure/hh180158.aspx –

+0

Tôi nghĩ rằng Azure nội bộ DNS sẽ xử lý địa chỉ dịch vụ đám mây của tôi và giải quyết nó đến đúng địa chỉ IP. Vì hai vai trò nằm trong cùng một dịch vụ đám mây nên họ có thể nói chuyện với nhau mà không có một công việc xung quanh? Tôi chỉ cần thêm một cổng cố định như ví dụ này và sẽ thử nó ngay bây giờ. Hay tôi đang thiếu một cái gì đó? https://msdn.microsoft.com/en-us/library/azure/hh180158.aspx –

Các vấn đề liên quan