2012-06-18 34 views
5

Tôi đi theo hướng dẫn này (ít nhất là WCF tôi có trụ sở tại này, coz Tôi cần sau đó làm việc như nhau): http://www.eggheadcafe.com/tutorials/wcf/b5ada8df-58c5-492f-b368-457b3a4f137c/notify-client-applications-using-wcf-callbacks.aspxCách sử dụng Dịch vụ kép WCF qua internet?

Nó làm việc rất tốt trên máy tính của tôi, nhưng tôi cần phải sử dụng nó qua internet. Trong khi cố gắng để làm điều này tôi nghe (qua internet) đó là tốt hơn để sử dụng netTcpBiding.

Tôi sẽ có một máy chủ sẽ nhận biết số lượng khách hàng trực tuyến. Tôi muốn một dịch vụ WFC trên IIS của tôi trong máy chủ, và một dịch vụ windows tiêu thụ nó và thông báo cho nó. Tôi cần coz gọi lại máy chủ đôi khi phải có khả năng thực hiện một số lệnh trên máy khách.

Tôi sẽ rất hài lòng nếu có ai có thể giúp tôi.

Cảm ơn trước,

Edit:

Làm bản thân mình rõ ràng: Tôi chỉ không thể làm cho nó hoạt qua internet. Các bạn có thể chỉ cho tôi cách tôi có thể thay đổi cấu hình của mình (Web.config e App.config) để sử dụng netTcpBinding và làm việc trên internet không?

Cảm ơn một lần nữa,

Sửa 2:

Web.config của tôi trong WCFServiceApplication của tôi là:

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 
    <bindings> 
     <wsDualHttpBinding> 
     <binding name="WSDualHttpBinding_IPCWatcherWCFService" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
      messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
       maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" /> 
      <security mode="Message"> 
      <message clientCredentialType="Windows" negotiateServiceCredential="true" algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </wsDualHttpBinding> 
    </bindings> 
    <services> 
     <service behaviorConfiguration="TiT.PCWatcher.Server.WCFService.Services.PCWatcherWCFServiceBehavior" name="TiT.PCWatcher.Server.WCFService.Services.PCWatcherWCFService"> 
     <endpoint address="" binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_IPCWatcherWCFService" contract="TiT.PCWatcher.Server.WCFService.Interfaces.IPCWatcherWCFService"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="TiT.PCWatcher.Server.WCFService.Services.PCWatcherWCFServiceBehavior"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 
</configuration> 

My App.config trong WindowsService của tôi là:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <bindings> 
     <wsDualHttpBinding> 
     <binding name="WSDualHttpBinding_IPCWatcherWCFService" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" 
      textEncoding="utf-8" useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
      maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" /> 
      <security mode="Message"> 
      <message clientCredentialType="Windows" negotiateServiceCredential="true" 
       algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </wsDualHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:25145/Services/PCWatcherWCFService.svc" 
     binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_IPCWatcherWCFService" 
     contract="PCWatcherWCFServiceReference.IPCWatcherWCFService" 
     name="WSDualHttpBinding_IPCWatcherWCFService"> 
     <identity> 
      <dns value="localhost" /> 
     </identity> 
     </endpoint> 
    </client> 
    </system.serviceModel> 
</configuration> 

Chỉ cần thay đổi nó thành netTcpBinding không hoạt động ...

Nhưng tôi sẽ vui mừng, đủ để có thể chạy trên internet ... Tôi đã xuất bản WCFService trên IIS. Liên kết:

https://www2.tcenter.com.br/monitor/PCWatcherWCFService.svc

HOẶC

http://www2.tcenter.com.br:8080/monitor/PCWatcherWCFService.svc

Chỉ cần thay đổi configs enought của mình để làm cho nó hoạt động thông qua internet? như tôi đã nói, địa phương nó hoạt động tốt.

Tôi nghĩ rằng chỉ cần thay đổi địa chỉ điểm cuối trên máy khách với một trong các URL của nó trên whould làm việc, nhưng nó đã không ...

Các ví dụ mà bạn liên kết host các dịch vụ trên WPF. Tôi không biết nếu nó áp dụng cho cenario của tôi ...

Tôi nghĩ rằng tôi sẽ gắn bó với DualHttpBinding, bạn không nghĩ rằng cổng chuyển tiếp đó là tốt cho nhu cầu của tôi, tôi có thể có rất nhiều của khách hàng trong một mạng nội bộ và có bộ định tuyến quyết định cái nào anh ta sẽ gửi thông tin cho nó không tốt lắm? hoặc có một cách để làm cho bộ định tuyến đáp ứng một cách tinh tế cho mỗi máy và mọi máy con trỏ đến máy chủ web của tôi thông qua cùng một cổng?(Chỉ cần hỏi, hehehe)

Thanks a lot trước,

Edit trên 21/06/2012:

Cảm ơn đã đọc. Tôi không thể sử dụng dịch vụ netTcpBinding trong mạng LAN. Tôi đã làm một mẫu giả của cenario của tôi. Đó là here. Được gọi là DualCommunicationTest.

Khi tôi bắt đầu bài đăng này, tôi chỉ muốn biết cách làm cho cenarion này chạy trên internet. Chỉ vậy thôi. Trong thời gian tôi tìm kiếm giải pháp trước khi đăng bài ở đây, tôi đã đọc rằng netTcpBinding là tốt hơn. Vì vậy, tôi hỏi về nó. Đó chỉ là một câu hỏi phụ.

... Vì vậy, nhu cầu hiện tại của tôi trên bài là:

Làm thế nào để sử dụng the sample i developed trên internet.

HOẶC

Làm thế nào để làm cho the sample i developed làm việc với netTcpBinding VÀ sau đó có thể sử dụng nó trên internet. (Tôi khá chắc chắn Clunky Coder đã dạy tôi phần thứ hai, về cách xuất bản một net.tcp trên internet với IIS và các công cụ, cảm ơn rất nhiều cho điều đó, nhưng tôi đã không thể kiểm tra nó được nêu ra, bởi vì tôi couldn ' t làm một netTcp chưa.)

Tôi xin lỗi nếu tôi không đủ rõ ràng, tiếng Anh của tôi không tốt. sry và cảm ơn một lần nữa, rất nhiều.

Trả lời

5

netTcpBinding tốt hơn cho giao tiếp song công (giao tiếp với gọi lại) và nó có hiệu suất cao hơn WSDualHttpBinding là liên kết ưu tiên cho giao tiếp song công qua HTTP. Nhưng bạn không nên thực sự sử dụng netTcpBinding qua internet mặc dù bạn về mặt kỹ thuật có thể và có thể hoạt động, nhưng các cổng sử dụng có thể (và thường) bị chặn bởi tường lửa trên internet. Khi bạn gửi một cái gì đó trên internet, nó làm cho rất nhiều bước nhảy và đi qua rất nhiều bộ định tuyến và tường lửa, và không có đảm bảo rằng những bộ định tuyến và tường lửa sẽ có tất cả các cổng mở. Nhưng nếu bạn có thể mở cổng (đối với netTcp là TCP 808) trên cả máy khách và máy chủ (thường được thực hiện bằng chuyển tiếp cổng trên bộ định tuyến), nó có thể hoạt động, nhưng lời khuyên chung là không sử dụng netTcpBinding qua internet. Có nói rằng tôi đã sử dụng nó một vài lần cho các dịch vụ của tôi, và khách hàng của tôi đã có thể sử dụng dịch vụ trên internet mà không có bất kỳ vấn đề nào sau khi tôi chuyển tiếp các cổng trên cả máy khách và máy chủ.

Nói chung để liên lạc hai chiều qua internet, bạn có WSDualHttpBinding và nếu bạn có ứng dụng Silverlight (Silverlight không hỗ trợ WSDualHttpBinding), bạn có thể sử dụng PollingDuplexHttpBinding.

Tôi cũng khuyên bạn nên đọc this.

EDIT:

Để thay đổi điều đó ví dụ để sử dụng netTcpBinding, chỉ cần thay đổi các ràng buộc trong tập tin cấu hình để sử dụng netTcpBinding thay vì wsDualHttpBinding. Hãy xem this article, liên kết bạn đã đăng là gì, với netTcpBinding và giải thích thêm.

EDIT 20/06/2012:

Làm bản thân mình rõ ràng: Tôi chỉ không thể làm cho nó hoạt qua internet. Các bạn có thể chỉ cho tôi cách tôi có thể thay đổi cấu hình của mình (Web.config e App.config) để sử dụng netTcpBinding và làm việc trên internet không?

Dường như bạn đã có thể làm cho dịch vụ hoạt động với netTcpBinding trong mạng LAN, vì vậy vấn đề trước đó của bạn hiện đã được khắc phục và bạn đang gặp sự cố khi lưu trữ dịch vụ trong IIS và xuất bản trực tuyến. Khi dịch vụ của bạn hoạt động trong mạng LAN, nó sẽ hoạt động trên internet khi bạn lưu trữ nó trong IIS và chuyển tiếp các cổng thích hợp trên các máy khách và máy chủ, đây là một kịch bản phổ biến và được ghi lại trực tuyến. Để thực hiện việc này Bạn phải lưu trữ dịch vụ của bạn như một ứng dụng trong trang web IIS của bạn. Bạn cần đảm bảo dịch vụ của bạn có tệp .svc trỏ đến vị trí của dịch vụ, sau đó sao chép nội dung của App.Config (tệp cấu hình dịch vụ) vào web.config mới (trong cùng thư mục vật lý như của bạn App.config) và cũng loại bỏ phần <host><baseAddresses> trong web.config vừa được tạo, trỏ đường dẫn vật lý của ứng dụng tới vị trí của dịch vụ này trên máy chủ lưu trữ dịch vụ của bạn. Một khi đã được xử lý, chỉ cần chắc chắn chỉnh sửa các ràng buộc trang web mặc định để kích hoạt các ràng buộc cụ thể mà dịch vụ của bạn sử dụng, để netTcpBinding truy cập: Website -> 'Chỉnh sửa Bindings ...' -> 'Add ...' rồi chọn net .tcp và gán cho nó các cổng. Sau đó, trên ứng dụng của bạn, hãy truy cập 'Cài đặt nâng cao' và bật dịch vụ net.tcp, netTcpBinding thường sẽ có http,net.tcp làm giao thức được bật. Nếu bạn gặp lỗi mọc răng, hãy đảm bảo rằng nhóm ứng dụng mặc định (hoặc hồ bơi ứng dụng nào mà trang web của bạn đang sử dụng) có các quyền cần thiết để truy cập và đọc thư mục vật lý trên máy chủ mà dịch vụ cư trú.

Vui lòng đọc thisthis, yêu cầu tôi xây dựng sẽ chỉ lặp lại những gì họ đang nói.

EDIT 21/06/2012:

Tôi chỉ cần tải dịch vụ của bạn và lưu trữ nó trong IIS và nó được lưu trữ tốt, kể từ khi sử dụng nó HTTP và không nettcp sau đó có nghĩa là nó hoạt động hoàn toàn tốt đẹp trên internet. Nếu dịch vụ của bạn là một cái gì đó đơn giản và bạn không mong đợi để xử lý nặng với nó (bởi vẻ ngoài của nó bạn chỉ đang cố gắng để có được danh sách các khách hàng kết nối với nó) sau đó gắn bó với wsDualHTTPBinding vì giao thức HTTP sẽ làm việc bất kỳ môi trường nào và bạn không phải lo lắng về tường lửa như bạn làm với netTcpBinding.Đây là tất cả những gì đã làm để lưu trữ các dịch vụ trong IIS (và làm cho nó có sẵn trên internet):

  1. Đến DefaultWebsite trong IIS, nhấp chuột phải, thêm ứng dụng, dưới bí danh chỉ cung cấp dịch vụ của bạn bất kỳ tên nào bạn muốn để có thể thấy trong URL. Chọn hồ bơi ứng dụng mặc định hoặc hồ bơi ứng dụng ASP.NET 4.0.

  2. Chỉ đường dẫn vật lý đến nơi tệp .svc của bạn nằm trên máy tính; đối với tôi nó:

C:\Users\MyPC\Documents\DualCommunicationTest.Server\WcfServiceApp

  1. Theo giao thức cho phép đảm bảo rằng bạn có HTTP trên cổng 80 hoặc bất kỳ cổng khác, ví dụ 8085, nhưng bạn sẽ cần để chuyển tiếp cổng này trên router của bạn để Máy chủ lưu trữ dịch vụ. Nếu máy chủ Dịch vụ của bạn nằm trên IP 192.168.1.4 trong mạng LAN của bạn, thì trên bộ định tuyến chuyển tiếp cổng 80 (hoặc bất kỳ cổng nào bạn sử dụng-nói 8085) đến máy tính 192.168.1.4.

Và điều đó thật dễ dàng.

+0

Đọc sách thật sự ... ok, tôi không biết nữa nếu tôi đang dùng netTcp hoặc wsDual, nhưng, bạn có thể vui lòng giúp tôi làm cho nó hoạt động không? Tôi rất vui khi chỉ đưa ví dụ được triển khai vào liên kết ở trên để làm việc ... –

+0

@TanielianBarreira, tôi chỉ xem bài viết, có vẻ như được viết, chính xác thì vấn đề là gì? Nó thực hiện một dịch vụ trò chuyện đơn giản bởi vẻ ngoài của nó, có rất nhiều ví dụ về callbacks trong WCF. ý chính của ý tưởng là khách hàng gọi một số thao tác trên dịch vụ và dịch vụ có thể lần lượt gọi một phương thức trên máy khách (đây là cuộc gọi lại), vì vậy máy khách tạm thời sẽ giống như một máy chủ. Các phương thức trong 'ChatService' là những gì khách hàng gọi trên máy chủ và các phương thức trong' IChatServiceCallback' là những gì dịch vụ gọi trên máy khách. –

+0

@TanielianBarreira nhìn vào bản cập nhật của tôi. –

1

Ràng buộc TCP tốt hơn cho các cuộc gọi lại qua internet vì TCP là hai hướng theo bản chất. HTTP là một yêu cầu, đó là một cách duy nhất. Do đó đôi trong dualHttpBinding. WCF phải tạo một kết nối HTTP thứ hai trở lại máy khách để dịch vụ có thể gửi các yêu cầu tới máy khách.

Internet không thực sự được thiết lập để máy chủ gọi lại qua HTTP. Những thứ như NAT được thực hiện bởi các router có nghĩa là các cổng phải được chuyển tiếp để định tuyến yêu cầu HTTP đúng cách và máy khách sẽ phải chạy một máy chủ HTTP.

Vì vậy, việc sử dụng TCP dễ dàng hơn nhiều. Hoặc là có hoặc có thể có khách hàng yêu cầu một đối tượng trả lời được truyền trực tiếp từ cuối máy chủ (một kết thúc không bao giờ trả lời có hiệu lực), rằng máy chủ có thể kích hoạt thông báo. Điều này không đơn giản.

+0

Cảm ơn bạn đã trả lời, nhưng làm cách nào tôi có thể thay đổi ví dụ trên để sử dụng netTcp? –

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