2012-06-18 2 views
5

(I는 모두 작업을 한 후 필요 사촌 적어도이 내 WCF 기반) : 내 컴퓨터에서 잘 작동하지만 것 http://www.eggheadcafe.com/tutorials/wcf/b5ada8df-58c5-492f-b368-457b3a4f137c/notify-client-applications-using-wcf-callbacks.aspx인터넷을 통해 WCF 이중 서비스를 사용하는 방법은 무엇입니까? 나는이 튜토리얼을 따라

나는 인터넷을 통해 그것을 사용해야합니다. 이 작업을 시도하는 동안 netTcpBiding을 사용하는 것이 더 좋습니다 (인터넷을 통해)라고 들었습니다.

온라인으로 클라이언트 수를 알고있는 서버를 갖게됩니다. 서버의 IIS에 WFC 서비스가 필요하고 Windows 서비스에서이를 소비하고이를 알립니다. 나는 콜백 서버가 언젠가는 클라이언트에서 몇 가지 명령을 실행할 수 있어야합니다 coz 필요합니다.

누구든지 나를 도울 수 있다면 매우 기쁠 것입니다. 사전에

감사합니다,

편집 :

자신을 명확 만들기 : 나는 그냥 인터넷을 통해 작동 할 수 없었다. 어떻게하면 내 구성 (Web.config e App.config)을 변경하여 netTcpBinding을 사용하고 인터넷을 통해 작업 할 수 있는지 보여 줄 수 있습니까? 다시

감사합니다,

편집 2 :

내 WCFServiceApplication 나의의 Web.config은 다음과 같습니다

<?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> 
내 윈도우 서비스에

내의 App.config입니다 :

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

그냥 netTcpBinding으로 변경하면 작동하지 않습니다 ...

하지만 인터넷을 통해 실행할 수있을만큼 기뻐할 것입니다 ... IIS에 WCFService를 게시했습니다. 링크 :

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

또는 그냥 CONFIGS는 인터넷을 통해 작동하도록 그 한 정도로 변화

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

? 내가 말했듯이, 그것은 잘 작동합니다.

나는 그것이 작동 whould 위에 바로 URL의 중 하나에 클라이언트의 엔드 포인트 주소를 변경 생각하지만,

당신은 호스트에게 WPF에서 서비스를 연결 예제 ...하지 않았다. 내 cenario에 적용되는지 모르겠다 ...

나는 듀얼 HTTP 바인딩을 계속 사용한다고 생각하지 않는다. 포트 포워딩이 내 요구에 잘 맞다고 생각하지 않는다. 나는 많이 가질 수있다. 하나의 인트라넷에있는 클라이언트 중 라우터가 라우터를 결정하는 데 아무런 문제가 없다는 정보를 보내겠습니까? 라우터가 똑같은 포트를 통해 내 웹 서버에 연결되는 각각의 모든 컴퓨터에 정확하게 응답하도록하는 방법이 있습니까?!읽기에 대한

감사 : 사전에

고마워, 21/06/2012에

편집 (단지 히히히, 요청). LAN에서 netTcpBinding을 사용하여 서비스를 사용할 수 없습니다. 나는 나의 cenario의 모의 샘플을 만들었습니다. here입니다. DualCommunicationTest라고합니다.

내가이 게시물을 시작했을 때, 저는이 세나리온을 인터넷에서 실행하는 방법을 알고 싶었습니다. 그냥. 여기에 게시하기 전에 솔루션을 검색하는 동안 netTcpBinding이 더 좋다고 읽었습니다. 그래서 나는 그것에 대해 물었다. 그것은 단지 부작용이었습니다.

그래서 ... 포스트에 내 현재의 요구 사항은 다음과 같습니다

어떻게 인터넷에 the sample i developed를 사용 할 수 있습니다.

또는

어떻게 netTcpBinding과 the sample i developed 작업을 확인하고 인터넷을 사용할 수 있습니다. (나는 꽤 확신한다. Clunky Coder은 인터넷과 IIS에 net.tcp를 게시하는 방법에 대해 두 번째 부분을 가르쳐 주었고, 덕분에 많이 감사했다. 그러나 나는 아직 테스트 할 수 없었다. 왜냐하면 나는 ' 아직 netTcp를하지 마라.)

만일 내가 분명하지 않으면 미안하다, 나의 영어는 그렇게 좋지 않다. 다시 한번 고맙다.

답변

5

netTcpBinding은 이중 통신 (콜백 통신)에 적합하며 HTTP를 통한 이중 통신의 기본 바인딩 인 WSDualHttpBinding보다 성능이 좋습니다. 그러나 기술적으로는 일 수 있고 일 수 있지만 작동 할 수 있지만 netTcpBinding 포트는 인터넷의 방화벽에 의해 차단 될 수 있습니다 (일반적으로 방화벽에 의해 차단 될 수 있습니다.) 실제로는 인터넷에서 netTcpBinding을 사용하면 안됩니다. 인터넷을 통해 무언가를 보내면 많은 홉을 만들어 라우터와 방화벽을 많이 사용하게되며 라우터와 방화벽이 모든 포트를 개방한다는 보장은 없습니다. 그러나 클라이언트 및 서버 엔드 포인트 (일반적으로 라우터에서 포트 포워딩을 통해 수행됨)에서 포트 (netTcp의 경우 TCP 808)를 열 수 있다면 작동 할 수 있지만 일반적인 조언은 인터넷을 통해 netTcpBinding을 사용하지 않는 것입니다. 필자는 서비스를 위해 두 번 사용했으며, 클라이언트와 서버 양쪽에서 포트를 전달한 후 문제없이 인터넷을 통해 서비스를 사용할 수 있었다고 말했 다.

일반적으로 인터넷을 통한 양방향 통신의 경우 사용자는 WSDualHttpBinding이고 Silverlight 클라이언트 (Silverlight는 WSDualHttpBinding을 지원하지 않음)를 사용하는 경우 PollingDuplexHttpBinding을 사용할 수 있습니다.

나는 또한 this을 읽는 것이 좋습니다.

편집 :

그냥 대신 wsDualHttpBindingnetTcpBinding를 사용하도록 설정 파일에 바인딩을 변경, netTcpBinding를 사용하는 예를 변경합니다. this article을 보시고 귀하가 게시 한 링크가 무엇인지, netTcpBinding 이상의 설명과 함께하십시오.

편집 20/06/2012 :

자신을 명확 만들기 : 난 그냥 인터넷을 통해 작동 할 수 없었다. 내가 어떻게 구성을 변경할 수 있습니까 (Web.config e App.config) netTcpBinding을 사용하고 인터넷을 통해 작업 할 수 있습니까?

은 그래서 당신의 이전 문제가 수정되었습니다 당신이 지금 문제가 IIS에서 호스팅 서비스를 가진 온라인을 게시하고, 당신은 LAN에서 netTcpBinding와 함께 작업 할 수있는 서비스를받을 수 있었던 것 같다. 서비스가 LAN에서 작동하면 IIS에서 호스트하고 클라이언트 및 서버 라우터에서 적절한 포트를 전달하면 인터넷을 통해 작동합니다. 이는 일반적인 시나리오이며 온라인에서도 잘 설명되어 있습니다. 이렇게하려면 IIS 웹 사이트에서 응용 프로그램으로 서비스를 호스팅해야합니다. 서비스의 위치를 ​​가리키는 .svc 파일이 있는지 확인한 다음 의 내용을 App.Config (서비스 구성 파일)를 새 web.config (같은 실제 디렉토리에 복사하십시오. App.config)을 열고 새로 만든 web.config에서 <host><baseAddresses> 섹션을 제거한 다음 응용 프로그램의 실제 경로가 서비스 호스트 컴퓨터의이 서비스 위치를 가리 키도록하십시오. 그게 처리되면, 귀하의 서비스가 사용하는 특정 바인딩을 사용하도록 기본 웹 사이트 바인딩을 편집하십시오. netTcpBinding : Website -> 'Edit Bindings ...'-> 'Add ...' .tcp를 만들고 포트에 할당하십시오. 그런 다음 응용 프로그램에서 '고급 설정'으로 이동하여 net.tcp를 활성화하면 서비스는 프로토콜이 활성화되어 있으므로 일반적으로 http,net.tcp이됩니다. 치아 오류가 발생하면 기본 응용 프로그램 풀 (또는 웹 사이트 응용 프로그램 풀이 사용중인 서비스)에 서비스가있는 서버의 실제 디렉터리에 액세스하고이를 읽는 데 필요한 권한이 있는지 확인하십시오.

thisthis을 읽어 보시기 바랍니다. 말씀 하시려는 내용을 반복해서 설명해주십시오.

편집 21/06/2012는 :

난 그냥 서비스를 다운로드 및 IIS에서 호스팅하고 그것을 인터넷에 완벽하게 잘 작동 즉, 다음 nettcp하지 HTTP를 사용하고 이후는, 미세 호스팅. 서비스가 단순하고 무거운 처리를 기대하지 않는다면 (클라이언트의 목록을 얻으려는 시도로 보임), HTTP 프로토콜이 작동하기 때문에 wsDualHTTPBinding을 사용하십시오. 어떤 환경이라도 방화벽처럼 걱정할 필요가 없습니다. netTcpBinding.당신의 서비스 당신이 원하는 이름을 마우스 오른쪽 클릭 별칭에서, 응용 프로그램을 추가 IIS에서 DefaultWebsite 할

  1. 이동 : 이것은 내가 IIS에서 서비스를 호스팅 (그리고 인터넷을 통해 사용할 수 있도록)하는 한 모든입니다 URL에서 볼 수 있습니다. 기본 응용 프로그램 풀 또는 ASP.NET 4.0 응용 프로그램 풀을 선택하십시오.

  2. 컴퓨터에서 .svc 파일의 실제 경로를 가리 키십시오. 나를 위해 그 : 사용할 수있는 프로토콜에서

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

  1. 는 예를 들어 8085를 위해, 포트 80 또는 다른 포트에서 HTTP를 가질 수 있도록,하지만 당신은 당신의 라우터에서이 포트를 전달해야합니다 서비스 호스트 컴퓨터. 서비스 호스트가 LAN의 IP 192.168.1.4에있는 경우 라우터의 포트 80 (또는 사용하는 포트 - 8085)에서 컴퓨터 192.168.1.4로 전달하십시오.

그리고 그렇게 쉽습니다.

+0

참 좋은 독서가 ... 네, netTcp 또는 wsDual을 사용한다면 더 이상 알지 못합니다.하지만 작동하도록 도와 주시겠습니까? 위의 링크에서 구현 된 예제를 작업에 넣는 것만으로도 행복합니다 ... –

+0

@TanielianBarreira, 방금 기사를 보았습니다. 문제가 정확히 무엇인가요? 간단한 채팅 서비스를 구현하고 있습니다. WCF의 콜백에 대한 예제가 많이 있습니다. 아이디어의 요지는 클라이언트가 서비스에서 일부 작업을 호출하고 서비스가 클라이언트에서 메소드를 호출 할 수 있다는 것입니다 (콜백 임). 따라서 클라이언트는 일시적으로 서버 자체와 같을 것입니다. 'ChatService'의 메소드는 클라이언트가 서버에서 호출하는 메소드이고,'IChatServiceCallback'의 메소드는 서비스가 클라이언트에서 호출하는 메소드입니다. –

+0

@TanielianBarreira가 내 업데이트를 확인합니다. –

1

TCP는 기본적으로 양방향이므로 TCP 바인딩은 인터넷을 통한 콜백에 적합합니다. HTTP는 요청이며 한 가지 방법입니다. 따라서 dualHttpBinding의 이중성. WCF는 두 번째 HTTP 연결을 클라이언트에 다시 만들어서 서비스가 클라이언트에 요청을 보낼 수 있도록해야합니다.

서버가 HTTP를 통해 다시 콜백하도록 인터넷이 설정되지 않았습니다. 라우터가 NAT를 수행하는 것과 같이 HTTP 요청을 올바르게 라우팅하려면 포트를 전달해야하며 클라이언트는 HTTP 서버를 실행해야합니다.

그래서 TCP를 사용하는 것이 훨씬 쉽습니다. 클라이언트가 서버 끝에서 스트리밍되는 응답 객체 (실제로는 끝나지 않은 응답)를 요청할 수도 있고, 서버가 알림을 중지시킬 수도 있습니다. 이것은 간단하지 않습니다.

+0

답장을 보내 주셔서 감사합니다.하지만 어떻게 netTcp를 사용하기 위해 위의 예를 변경할 수 있습니까? –

관련 문제