0

サービス参照を追加せずに同期 WCF サービスの非同期クライアントを作成する方法はありますか? これは .NET 4 クライアント用です。

4

1 に答える 1

3

Visual Studioのサービス参照は、Webサービスを呼び出すために必要な対応するデータ要素を使用してプロキシクラスを作成するコードジェネレーターに他なりません。もちろん、退屈で退屈な作業を本当にやりたい場合は、プロキシを手動で作成できます。

たぶん、.netリフレクターを使用してSystem.ServiceModel.ClientBaseを逆コンパイルすることから始めますか?

ChannelFactoryについて調査してください:http://msdn.microsoft.com/en-us/library/system.servicemodel.channelfactory.aspx

ChannelFactoryをラップして独自のクライアントを実装する場合でも、別のプロジェクトでAdd Serviceリファレンスを使用してクラス定義を作成し、それらを実際のプロジェクトに移動しています。それは良い妥協案です。

単純な非同期サービスインターフェイスは次のとおりです。

[ServiceContract(Name = "IService")]
public interface IServiceAsync
{
    [OperationContract(AsyncPattern = true)]
    IAsyncResult BeginGetStuff(string someData, AsyncCallback callback, object state);

    IEnumerable<Stuff> EndGetStuff(IAsyncResult result);
}

.NETコントラクトは次のようになります。

[ServiceContract]
public interface IService
{
    [OperationContract]
    IEnumerable<Stuff> GetStuff(string someData);
}

次に、コードで、HTTP、セキュリティなし、バイナリメッセージエンコーディングを使用していると仮定すると、次のようになります(申し訳ありませんが、これはコンパイルしていません。プロジェクト用に作成したコードの一部を使用して入力しただけです)。

//Create a binding for the proxy to use
HttpTransportBindingElement httpTransportBindingElement;

httpTransportBindingElement = new HttpTransportBindingElement();
absoluteServiceUri = new Uri(absoluteServiceUri.OriginalString + BinaryEndpointUri, UriKind.Absolute);
}

//Create the message encoding binding element - we'll specify binary encoding
var binaryMessageEncoding = new BinaryMessageEncodingBindingElement();

//Add the binding elements into a Custom Binding            
var customBinding = new CustomBinding(binaryMessageEncoding, httpTransportBindingElement);

// Set send timeout
customBinding.SendTimeout = this.SendTimeout;   

var factory = new ChannelFactory<IServiceAsync>(customBinding, new EndpointAddress(absoluteServiceUri, new AddressHeader[0]));

var channel = factory.CreateChannel();
channel.BeginGetStuff(Bla, results => { // Do something }, null);
于 2013-01-15T04:46:15.737 に答える