2012-12-06 22 views
7

Tôi có dịch vụ WCF mà tôi đang cố định cấu hình để nó hiển thị 2 điểm cuối, tham khảo các chức năng khác nhau, trong các URL khác nhau.Dịch vụ WCF phơi bày 2 điểm cuối trên 2 hợp đồng dịch vụ khác nhau

Những gì tôi muốn có là Service1, phơi bày các phương pháp A, B, C, và Service2, phơi bày các phương pháp D, E. Tôi muốn để có thể duyệt cả localhost/WebServiceName/Service1/Dịch vụ .svclocalhost/WebServiceName/Service2/Service.svc.

Các ứng dụng khác tham khảo localhost/WebServiceName/Service1/Service.svc nên chỉ thấy giao diện có chứa các phương pháp A, B và C. Họ không nên nhìn thấy bất cứ điều gì liên quan đến giao diện Service2. Và đối với Service2 tương tự.

Cho đến nay tôi đã xác định hai giao diện trong dịch vụ WCF của mình, I_Service1I_Service2.

tôi đã bổ sung thêm hai điểm cuối trong web.config của tôi như vậy:

<endpoint address="http://localhost/WebServiceName/Service1/" binding="wsHttpBinding" contract="WebServiceName.I_Service1" bindingConfiguration="Binding1" /> 
<endpoint address="http://localhost/WebServiceName/Service2/" binding="wsHttpBinding" contract="WebServiceName.I_Service2" bindingConfiguration="Binding2" /> 

Các gợi ý của việc sử dụng địa chỉ đầy đủ trong enpoint xuất phát từ đây: Multiple endpoints under IIS

Nhưng vẫn còn, tôi không thể duyệt localhost/WebServiceName/Service1/Service.svc. Tôi nhận:

Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable. Please review the following URL and make sure that it is spelled correctly. 

tôi thành công có thể duyệt localhost/WebServiceName/Service.svc và wsdl bao gồm các phương pháp A, B, C, D, E. Nhưng điều này nên sai trong hành vi của tôi muốn.

Có điều gì đó mà tôi đã bỏ lỡ không?

CẬP NHẬT: Theo bài viết này http://allen-conway-dotnet.blogspot.ro/2011/09/exposing-multiple-binding-types-for.html Tôi đã tạo hai dịch vụ hợp đồng khác nhau cho các điểm cuối đó. Nhưng hiện tại tôi chỉ đang nắm giữ Service1 khi tôi duyệt qua. Service2 dường như không tồn tại (các lỗi liên quan đến lỗi HTTP 404 xuất hiện).

Cấu hình trông giống như:

<services> 
    <service behaviorConfiguration="WebServiceName.ServiceBehavior1" name="WebServiceName.Service1"> 
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="Binding1" 
    contract="WebServiceName.I_Service1" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost/WebServiceName/Service1/Service.svc" /> 
     </baseAddresses> 
    </host> 
    </service> 
    <service behaviorConfiguration="WebServiceName.ServiceBehavior2" name="WebServiceName.Service2"> 
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="Binding1" 
    contract="WebServiceName.I_Service2" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost/WebServiceName/Service2/Service.svc" /> 
     </baseAddresses> 
    </host> 
    </service> 
    </services> 

Trả lời

1

Hiện tại, giải pháp của tôi cho vấn đề này đã kết hợp hai tệp .svc trong dịch vụ web của tôi để tách hai giao diện. Chẳng hạn, tôi có localhost/WebServiceName/Service1.svclocalhost/WebServiceName/Service2.svc.

Với cấu hình thiết bị đầu cuối

<services> 
    <service behaviorConfiguration="WebServiceName.ServiceBehavior1" name="WebServiceName.Service1"> 
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="Binding1" 
    contract="WebServiceName.I_Service1" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost/WebServiceName/Service1.svc" /> 
     </baseAddresses> 
    </host> 
    </service> 
    <service behaviorConfiguration="WebServiceName.ServiceBehavior2" name="WebServiceName.Service2"> 
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="Binding2" 
    contract="WebServiceName.I_Service2" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost/WebServiceName/Service1.svc" /> 
     </baseAddresses> 
    </host> 
    </service> 
    </services> 

Giải pháp này là không cần thiết tốt nhất (nếu một khách hàng thực sự muốn, nó có thể thấy rằng dịch vụ này cho thấy 2 giao diện khác nhau, nhưng tôi có thể đảm bảo cho họ với các thông tin khác nhau/mã thông báo). Nhưng tại thời điểm này tôi sẽ đi với nó.

1

tôi đã cố gắng để làm điều mà bạn mô tả. Tất cả điều này thành công. Xin đừng giận nếu một số bước rõ ràng cho bạn. Vì vậy:

  1. Tạo dự án ứng dụng dịch vụ WCF.
  2. Thêm hai mục Dịch vụ WCF (theo mặc định sẽ tạo giao diện và tệp svc).
  3. Tạo dự án Ứng dụng web.
  4. Thêm hai tham chiếu dịch vụ (Nhấp chuột phải vào Dự án ứng dụng web ==> Thêm tham chiếu dịch vụ) bằng cách sử dụng nút 'Khám phá' (hai dịch vụ web sẽ hiển thị).
  5. Đó là tất cả.

Theo mặc định tôi đã web.config sau đây trong dự án ứng dụng Web:

 <system.serviceModel> 
<bindings> 
    <basicHttpBinding> 
    <binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00" 
     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
     allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
     maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
     useDefaultWebProxy="true"> 
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
     maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     <security mode="None"> 
     <transport clientCredentialType="None" proxyCredentialType="None" 
      realm="" /> 
     <message clientCredentialType="UserName" algorithmSuite="Default" /> 
     </security> 
    </binding> 
    <binding name="BasicHttpBinding_IService2" closeTimeout="00:01:00" 
     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
     allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
     maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
     useDefaultWebProxy="true"> 
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
     maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     <security mode="None"> 
     <transport clientCredentialType="None" proxyCredentialType="None" 
      realm="" /> 
     <message clientCredentialType="UserName" algorithmSuite="Default" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<client> 
    <endpoint address="http://localhost:3597/Service1.svc" binding="basicHttpBinding" 
    bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1" 
    name="BasicHttpBinding_IService1" /> 
    <endpoint address="http://localhost:3597/Service2.svc" binding="basicHttpBinding" 
    bindingConfiguration="BasicHttpBinding_IService2" contract="ServiceReference2.IService2" 
    name="BasicHttpBinding_IService2" /> 
</client> 

Bạn có thể cố gắng để xây dựng lại dự án WCF và Cập nhật WebReferences.

+2

Không có gì sai khi nêu rõ các bước rõ ràng; hầu hết thời gian họ là những người chúng ta quên. Tuy nhiên, câu hỏi của tôi là về cách cấu hình một Dịch vụ Web với 2 điểm cuối, không phải hai Dịch vụ Web khác nhau. Ngoài ra, phần cấu hình là về những gì nên được cấu hình trong Web.config Web Service đó, không phải trong web.config hoặc app.config của các ứng dụng tham chiếu nó. –

3

Con đường tôi đã luôn luôn làm điều này như sau: thiết lập một "địa chỉ cơ sở" duy nhất cho dịch vụ và xác định điểm kết thúc giải quyết văn bản như khác nhau để nối thêm vào địa chỉ cơ sở ...

<service name="MyNamespace.MyService"> 
    <endpoint address="FirstEndpointAddress" binding="netTcpBinding" 
     name="FirstEndpointName" 
     contract="MyNamespace.FirstEndpointContract" /> 
    <endpoint address="SecondEndpointAddress" binding="netTcpBinding" 
     name="SecondEndpointName" 
     contract="MyNamespace.SecondEndpointContract" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="net.tcp://localhost:8733/MyBaseAddress" /> 
     </baseAddresses> 
    </host> 
    </service> 

Vì vậy, trong trường hợp của bạn, địa chỉ cơ sở có thể là localhost/WebServiceName và địa chỉ điểm cuối cho điểm cuối 1 có thể là Service1/Service.svc. Tương tự như vậy đối với điểm cuối 2, nó có thể là Service2/Service.svc. Tôi có thể thấy rằng bạn đã theo lời khuyên để đưa địa chỉ đầy đủ vào địa chỉ điểm cuối, nhưng tất cả những gì tôi có thể nói là tôi đã thực hiện theo cách này với thành công.

+0

Ngay cả với cách tiếp cận này, tôi nhận được lỗi HTTP 404 cho localhost: 8733/MyBaseAddress/FirstEndpointName/Service.svc (mặc dù khi tôi cố gắng thêm một tham chiếu dịch vụ trong một máy khách rõ ràng localhost: 8733/MyBaseAddress/Service.svc được nhìn thấy trong khi khám phá các dịch vụ, với cả hai giao diện xấu trong trường hợp của tôi). Có thể có một lỗi cấu hình trong điều khoản của IIS, không phải web.config? Tôi đã thử tạo hai Thư mục Ảo cho hai điểm cuối, nhưng cả hai thư mục ảo đều được liên kết với giao diện của thiết bị đầu cuối đầu tiên. –

+1

Trừ khi bạn đã đưa ra một trong những điểm cuối của bạn địa chỉ "FirstEndpointName/Service.svc" Tôi sẽ không mong đợi địa chỉ bạn đã sử dụng để làm việc. Nhớ tên điểm cuối và địa chỉ điểm cuối là những thứ khác nhau. – Martin

+0

Địa chỉ cuối cùng trở thành: localhost: 8733/MyBaseAddress/Service.svc/FirstEndpointAddress và localhost: 8733/MyBaseAddress/Service.svc/SecondEndpointAddress Trong mã khách hàng: var svcClient = new ServiceReference1.ServiceClient ("SecondEndpointName"); – hB0