2016-08-11 5 views
0

サードパーティの非同期Webサービスを使用する必要があります。c#戻り値のあるasync Webサービスを呼び出す

1つの特定のサービスが文字列を返す必要があります。私はxamarinアンドロイドのアプリからそれを呼んでいます。そして、私はコアポータブルプロジェクトにサービスアクセスロジックを作成しました。

Webサービスが正常に動作し、Soap UIでテストしたところ、戻り値は有効です(要求と文字列の戻り値の2つの文字列パラメータがあります)。

これは私がコアポータブルなライブラリ上のサービスへのアクセスを作成する方法である:

私は、クライアント上でこのサービスを呼び出す方法を
public static async Task<string> GetResult(string param2) 
{ 
    XSoapClient client = new XSoapClient(); 
    var result = await GetResultAsync(client, PARAM_1, param2); 
    return result; 
} 

private static Task<string> GetResultAsync(this XSoapClient @this, 
     string param1, string param2) 
{ 
    var tcs = new TaskCompletionSource<string>(); 
    EventHandler<MyServiceCompletedEventArgs> callback = null; 

    callback = (sender, args) => 
    { 
     @this.MyServiceCompleted -= callback; 
     if (args.Cancelled) tcs.TrySetCanceled(); 
     else if (args.Error != null) tcs.TrySetException(args.Error); 
     else tcs.TrySetResult(args.Result); 
    }; 

    @this.MyServiceCompleted += callback; 
    @this.MyServiceAsync(param1, param2); 

    return tcs.Task; 
} 

そして、この - このケースでAndroidアプリxamarin:

button.Click += async delegate 
     { 
      string param2 = p2EditText.Text; 
      var result = await ServiceAccessLayer.GetResult(param2); 
      resultEditText.Text = result; 
     }; 

この

[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] 
    private string EndMyService(System.IAsyncResult result) { 
     Core.ServiceReference.MyServiceResponse retVal = ((Core.ServiceReference.XSoap)(this)).EndMyService(result); 
     return retVal.Body.MyServiceResult; // <= this line because Body is null 
    } 

私は理由を理解していませんWebサービスコードのこの部分について例外をスローします。Bodynull

EDITです:私もこの方法を試みた:

public static void GetResult(string param2) 
{ 
    XSoapClient client = new XSoapClient(); 
    client.MyServiceAsync(PARAM_1, param2); 
    client.MyServiceCompleted += Client_MyServiceCompleted; 
} 

private static void Client_MyServiceCompleted(object sender, MyServiceCompletedEventArgs e) 
{ 
    // do something with e.Result 
    var result = e.Result; 
} 

をしかし、私は同じエラーを得ました。

button.Click += async delegate 
    { 
     string param2 = p2EditText.Text; 
     var result = await ServiceAccessLayer.GetResponse(param2); 
     resultEditText.Text = result; 
    }; 

これがベストプラクティスです:

+1

なぜタスクベースのメソッドでサービスリファレンスを使用するだけではないのですか? – Biscuits

+1

必要がある場合は、IAsyncResultを正しく処理するためのTaskFactory.FromAsyncを参照してください。 – Biscuits

+0

私は非同期のsoap Webサービスの呼び出しに新しいです。これが私が価値を返す方法でした。私は別の方法を試みたが、同じエラーが発生した(私の質問を編集した) – lpfx

答えて

0

private Task<string> MakeRequest() 
{ 
    XSoapClient client = new XSoapClient(); 

    Task<string> request = Task.Factory.FromAsync(
     (callback, state) => c.BeginMyService(PARAM_1, param2, callback, state), 
     result => c.EndMyService(result), 
     TaskCreationOptions.None); 

    Task<string> resultTask = request.ContinueWith(response => 
     { 
      return response.Result; 
     }); 

    return resultTask; 
} 

public async Task<string> GetResponse() 
{ 
    var response = await MakeRequest(); 
    return response; 
} 

とAndroidアプリで通話が手に入れましたか?

関連する問題