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サービスコードのこの部分について例外をスローします。Body
はnull
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;
};
これがベストプラクティスです:
なぜタスクベースのメソッドでサービスリファレンスを使用するだけではないのですか? – Biscuits
必要がある場合は、IAsyncResultを正しく処理するためのTaskFactory.FromAsyncを参照してください。 – Biscuits
私は非同期のsoap Webサービスの呼び出しに新しいです。これが私が価値を返す方法でした。私は別の方法を試みたが、同じエラーが発生した(私の質問を編集した) – lpfx