SOAPベースのJava言語Webサービスを呼び出すためのC#コードをいくつか書いています。 wsdlから内部クラスを作成したとき、私は非同期バージョンを持つすべての同期エンドポイントも終了しました。これまでは、非同期呼び出しの必要がないため、これらを無視しました。長い話を短くするには、今必要があります。ここで非同期Java Webサービス呼び出しの呼び出し
は、私が試したものの一例と、それをテストするために(MS)ユニットテストです:
public class Lookups : IWebRepository
{
private readonly WebService _ws;
public Lookups()
{
_ws = WebServiceExtended.Instance.Endpoint;
}
public IEnumerable<string> Cities() => _ws.getLookupList("Cities").Select(o => o as lookup).Select(l => l.Name);
public async Task<IEnumerable<string>> CitiesAsync()
{
var results = await _ws.LookupAsync("Cities");
return results.Result.Select(o => o as lookup).Select(a => a.Name);
}
}
私はこの拡張機能を作成しました:
internal static class WebServiceAsyncExtensions
{
internal static Task<getLookupListCompletedEventArgs> LookupAsync(this WebService ws, string lookupKey)
{
var taskCreateSource = CreateSource<getLookupListCompletedEventArgs>(null);
ws.getLookupListCompleted += (sender, e) => TransferCompletion(taskCreateSource, e,() => e, null);
ws.getLookupListAsync(lookupKey);
return taskCreateSource.Task;
}
private static TaskCompletionSource<T> CreateSource<T>(object state) => new TaskCompletionSource<T>(state, TaskCreationOptions.None);
private static void TransferCompletion<T>(TaskCompletionSource<T> taskCreateSource, AsyncCompletedEventArgs e, Func<T> getResult, Action unregisterHandler)
{
if (e.UserState != taskCreateSource)
return;
if (e.Cancelled)
taskCreateSource.TrySetCanceled();
else if (e.Error != null)
taskCreateSource.TrySetException(e.Error);
else
taskCreateSource.TrySetResult(getResult());
unregisterHandler?.Invoke();
}
}
とテスト:
を[TestMethod]
public async Task Lookup_Async_Cities_Succeeds()
{
var response = await _ws.RepositoryLookups.CitiesAsync();
Assert.IsInstanceOfType(response, typeof(IEnumerable<string>));
Assert.IsTrue(response != null);
Assert.IsTrue(response.Any());
}
生成された(wsdl)コードを見ると、次のようになります。
/// <remarks/>
public void getLookupListAsync(string arg0) {
this.getLookupListAsync(arg0, null);
}
/// <remarks/>
public void getLookupListAsync(string arg0, object userState) {
if ((this.getLookupListOperationCompleted == null)) {
this.getLookupListOperationCompleted = new System.Threading.SendOrPostCallback(this.OngetLookupListOperationCompleted);
}
this.InvokeAsync("getLookupList", new object[] {
arg0}, this.getLookupListOperationCompleted, userState);
}
私が挑戦しているのは、私がラ・ラ・ランドにスピンオフしても返答を返さないということです。 Syncバージョンをテスト/呼び出しすると、期待される応答が得られます。これは長年にわたって使用してきたWebサービスであり、現在はC#側の機能を拡張しています。
何か不足していますか?まだ良いです。私は何が欠けているのですか?
[Fiddler](http://www.telerik.com/fiddler)のようなものを使用して、電線の状態を確認しましたか? –