私はCallback
のふるまいでwsDualHttpBinding
を実装しました。これは問題なく正常に動作します。クラスライブラリからWCFコールバックを呼び出すにはどうすればよいですか?
マイサービスコンフィグ
<behaviors>
<serviceBehaviors>
<behavior name="default">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="MyServiceNamespace" behaviorConfiguration="default">
<endpoint address="" binding="wsDualHttpBinding" contract="MyServiceCoontract" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https"/>
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
マイサービス契約
[ServiceContract(CallbackContract=typeof(IMQServiceCallBack))]
public interface IMQService
{
[OperationContract]
void PublishMessage(Message message);
}
public interface IMQServiceCallBack
{
[OperationContract(IsOneWay = true)]
void MessageAcked(string fileName);
[OperationContract(IsOneWay = true)]
void MessageNacked(string fileName);
}
マイサービス
public class MQService : IMQService
{
public IMQServiceCallBack CallBack
{
get
{
return OperationContext.Current.GetCallbackChannel<IMQServiceCallBack>();
}
}
public void PublishMessage(Common.Message message)
{
var mqManager = MQManager.GetInstance();
mqManager.PublishMessage(message);
CallBack.MessageAcked(message.FileName);
}
}
コールバックは私の実装ごとに、原則的に正常に動作します。しかし、私のコールバック呼び出しは、私のサービスクラスからではなく、クラスライブラリから来るべきです。
mqManager.PublishMessage(message)
をクラスライブラリに使用してメッセージを公開すると、そのライブラリに肯定応答用のコールバックが既に存在します。私MQManager
クラスだから、
void channel_BasicAcks()
{
//need to invoke service call back from here
}
で
コールバックは、基本的にchannel_BasicAcks()
コールバッククラスライブラリで呼び出されたとき、私は順番にサービスが私のクライアントをコールバックしなければならないように、このライブラリーを消費し、私のサービスを警告する必要があります。私はクラスライブラリのコールバックメソッドから私のサービスを警告する方法の中間ステップに立ち往生しています。ここの方向は私を助けるだろう。
はい、私は方法がないと思った。しかし、何もないと思ったときに私は敗北しました。SOの方法があります:)私はコールバックインターフェイスをクラスライブラリに移動し、そのライブラリに自分のOperationContextを渡したので、ライブラリ自体がクライアントに対してコールバックを呼び出すことができます – techspider