2017-06-26 20 views
0

私はいくつかのサービス(myService.svc、wsdlファイルから「新しいサービス参照の追加」を使用して生成)をホストする青空クラウドサービスプロジェクトを持っています。Azureの簡単な実装websocket

これはうまく動作し、処理が非常に簡単です。サービス宣言の

例:

<service behaviorConfiguration="myBehaviour" name="myService"> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     <endpoint address="" behaviorConfiguration="" binding="wsHttpBinding" bindingConfiguration="CentralSystemServiceSoap" contract="CentralSystemService" /> 
     </service> 

[System.ServiceModel.ServiceContractAttribute("CentralSystemService")] 
public interface CentralSystemService 
{ 

} 

しかし、私のデバイスのいくつかは今JSONを使ってWebSocketをプロトコルが必要です。

ウェブソケットのしくみについてたくさん読んできましたが、複雑すぎるように見える多くの異なる実装が見つかりましたが、主に完全に異なっていました。私は、WCFサービスに近い実装を探しました。しかし、すべての例は、例えば、ハンドシェイク部分を含んでいませんでした。

私のプロジェクトはazure(クラウドサービスインスタンス)に公開されています。以前のすべてのSVCはまだ動作している必要があります。

同じプロジェクト内にすべてを保持し、同じWebサイトのJSONサービスを作成できますか? 私が見つけた例のほとんどは、サーバーのリスナーを開くためのメイン関数を含んでいたため、私はクラウドプロジェクトでスタートアップのメインメソッドを設定できませんでした。

どのような実装をお勧めしますか?

は結合NetHttpBindingを使用している場合、我々はコールバック契約でWebSocketを介してWCFサービスとクライアント間で通信することができ、

答えて

1

、ありがとうございました。以下の手順は参考になります。

ステップ1、web.configで、NetHttpBindingをprotocolMappingとして設定する必要があります。

<protocolMapping> 
    <add scheme="http" binding="netHttpBinding"/> 
    <add scheme="https" binding="netHttpsBinding"/> 
</protocolMapping> 

ステップ2、コールバックを使用してサービス契約を作成します。

[ServiceContract] 
public interface IServiceCallback 
{ 
    [OperationContract(IsOneWay = true)] 
    Task SendMessageBack(string message); 
} 

[ServiceContract(CallbackContract = typeof(IServiceCallback))] 
public interface IService 
{ 
    [OperationContract(IsOneWay = true)] 
    Task DoSomething(string parameter); 
} 

ステップ3:WCFサービスでは、サービスコールバックのインスタンスを取得し、それを使用してクライアントにメッセージを送信できます。

public class MySocketService : IService 
{ 
    public async Task DoSomething(string parameter) 
    { 
     var callback = OperationContext.Current.GetCallbackChannel<IServiceCallback>(); 
     var random = new Random(); 
     int randomNumber = 2; 

     while (((IChannel)callback).State == CommunicationState.Opened) 
     { 
      await callback.SendMessageBack("Call back message:" + randomNumber); 
      randomNumber += random.Next(10); 
      await Task.Delay(1000); 
     } 
    } 
} 

ステップ4、クライアントでは、サービスコールバックインターフェイスを実装し、サービスからメッセージを受信する必要があります。詳細については

class Program 
{ 
    static void Main(string[] args) 
    { 
     var context = new InstanceContext(new CallbackHandler()); 
     var client = new ServiceClient(context); 
     client.DoSomething("a message"); 
     Console.ReadLine(); 
    } 
} 


public class CallbackHandler : IServiceCallback 
{ 
    void IServiceCallback.SendMessageBack(string message) 
    { 
     Console.WriteLine(message); 
    } 
} 

enter image description here

、下記のリンクをご参照用です。

How to: Create a WCF Service that Communicates over WebSockets

+0

ありがとうございます!しかし、私はクライアントにアクセスすることはできません、クライアントは私がそれと通信する必要があるデバイスです。 +あなたのコード/リンクでハンドシェイク部分がどのように動作するのか分かりません。 – user2088807

+0

データ転送をさらに制御する必要がある場合は、[SuperSocket](http://supersocket.net/)という名前の.NETライブラリを使用してwebsocketサーバーを作成することをお勧めします。 JSONのサポートが組み込まれており、Windowsサービス、コンソールアプリケーション、Webサイトなどの複数のホスティング環境をサポートしています。 – Amor

関連する問題