2011-12-02 35 views
8

Tóm tắt
Làm cách nào để truy cập dịch vụ WCF trên máy chủ cục bộ khi được lưu trữ trong IIS trên Azure? Azure không liên kết localhost hoặc 127.0.0.1 với trang web của tôi.Sử dụng WCF trên Localhost trên Azure

Chi tiết
Tôi có ứng dụng ASP.Net được lưu trữ trên Azure. Tôi đã thêm một .svc và một số quy trình công việc mà tôi muốn sử dụng qua WCF. Để giữ cho các vấn đề đơn giản, ứng dụng web của tôi chỉ đơn giản gọi các dịch vụ trên localhost, vì vậy tôi có các điểm cuối như thế này trong 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> 

Điều này chỉ hoạt động tốt trên máy cục bộ của tôi. Vấn đề là khi tôi xuất bản này để Azure, trang web trong IIS không nhận được một ràng buộc để localhost, thay vào đó các ràng buộc luôn luôn đến địa chỉ IP thực tế của máy chủ. Nó kết thúc lên tim như thế này trong 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> 

Vì vậy, ngay sau khi ứng dụng web của tôi cố gắng gọi cho dịch vụ trên localhost (127.0.0.1 hoặc cho rằng vấn đề) nó không thành công ngay lập tức. Không cần phải nói, nếu tôi rdp vào máy chủ và thay đổi ràng buộc thì tất cả đều ổn.

Những gì tôi thấy thực sự kỳ lạ là có tấn ví dụ ra có nơi mọi người đang truy cập dịch vụ WCF trên localhost trên Azure vì vậy tôi không thể hiểu tại sao điều này là như vậy. Tôi đã thiết lập osFamily thành 2 và để gỡ lỗi này, tôi đã cho phép xuất bản web và truy cập máy tính để bàn từ xa mà tôi đoán, theo lý thuyết, có thể gây rối mọi thứ.

Những gì tôi đã nhìn

  • tôi có thể viết lại địa chỉ điểm cuối trong mã của tôi trong thời gian chạy để thay thế localhost cho địa chỉ thực tế hoặc tạo ra các thiết bị đầu cuối tự động như mô tả của Ron trong các câu trả lời . Thật không may tôi đang sử dụng dịch vụ định tuyến WCF vì vậy tôi có thể làm việc phiên bản. Điều này có nghĩa là mã của tôi gọi điểm cuối Router và WCF Router lần lượt gọi dịch vụ/luồng công việc thực tế bằng cách sử dụng một điểm cuối được chỉ định trong web.config. Tôi không có quyền kiểm soát độ phân giải điểm cuối dịch vụ định tuyến mà không có, tôi nghĩ rằng, viết một tập hợp toàn bộ logic định tuyến mà chỉ có vẻ là rất nhiều công việc khi tôi muốn gọi localhost :)
  • Chuyển sang sử dụng tên ống; Than ôi, nó gây ra một số vấn đề kỳ lạ với quy trình công việc, có thể là do in hai mặt, và tôi đang ở hạn chót nên không có thời gian để đi đến đáy của nó vào phút đó.

Trả lời

1

Được rồi, vì vậy đây là cách tôi đã giải quyết. IMHO nó là một hack nhưng ít nhất nó hoạt động.

Về cơ bản, tôi cần thêm liên kết "*", vì vậy tôi có thể thực hiện việc này trong Powershell. Công thức chung là ở đây: http://blogs.msdn.com/b/tomholl/archive/2011/06/28/hosting-services-with-was-and-iis-on-windows-azure.aspx

Điều đó đề cập đến việc thêm hỗ trợ Ống có tên, nhưng nguyên tắc thì giống nhau. Tôi chỉ thay đổi kịch bản 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:"} 
} 

này bây giờ cho phép tôi sử dụng http://127.0.0.1:8080/service.svc để truy cập dịch vụ của tôi.

Lưu ý: Bạn không cần phải làm theo phần còn lại của các công thức để thiết lập bối cảnh thực hiện cao và thay đổi chế độ thi công powershell, do đó, theo nó một cách cẩn thận

+0

bất cứ ai có thể nói lý do tại sao isnt ràng buộc này đã có sẵn khi vai trò được tạo ra? – BozoJoe

4

Bạn phải xây dựng các địa chỉ endpoint động.

Bước 1: Trong ServiceDefinition.csdef bạn cần khai báo điểm cuối.

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

Bước 2: Khi bạn muốn gọi dịch vụ

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

Cảm ơn Ron. Tôi đã làm một cái gì đó tương tự như thế này và trong khi nó hoạt động tốt khi mã của tôi gọi dịch vụ, tôi sử dụng WCF Routing Service và tôi không thể (dễ dàng) kiểm soát cách dịch vụ định tuyến tạo điểm cuối, vì vậy phải dựa vào những gì trong web. config. Tốt câu trả lời cho trường hợp chung mặc dù, và xác nhận tôi không điên vì vậy 1. – Frans

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