2016-09-09 21 views
0

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#側の機能を拡張しています。

何か不足していますか?まだ良いです。私は何が欠けているのですか?

+0

[Fiddler](http://www.telerik.com/fiddler)のようなものを使用して、電線の状態を確認しましたか? –

答えて

0

JAVA Webサービスは、この場合、すべてのエンドポイントでasyncを認識しないことが分かります。 VSのMicrosoftのツールで作成されたすべてのエンドポイントのうち、非同期の2つのエンドポイントが見つかりました。レッスンはそれが定義されているという意味ではありません。

関連する問題