C# Xamarin Android在使用Web服务时的问题(SOAP.NET2.0)

C# Xamarin Android在使用Web服务时的问题(SOAP.NET2.0),c#,android,web-services,soap,xamarin,C#,Android,Web Services,Soap,Xamarin,在过去的几周里,我一直在使用Xamarin和Webservice(在Xamarin中称为.NET2.0WebService)。我遇到了一些我还无法解决的问题 1)如何设置Web服务的超时?无论其值如何,都将忽略Timeout属性。我相信使用的默认值大约是30秒。但是我想要5秒钟~~ 第二)当WebService调用任何异步方法时,使用Begin。是否仍然需要检查异步方法是否正确完成或超时?我得到“检查”的唯一方法是在结束时执行try/catch方法。如果由于超时而触发,它将引发异常。但我想知道是

在过去的几周里,我一直在使用Xamarin和Webservice(在Xamarin中称为.NET2.0WebService)。我遇到了一些我还无法解决的问题

1)如何设置Web服务的超时?无论其值如何,都将忽略Timeout属性。我相信使用的默认值大约是30秒。但是我想要5秒钟~~

第二)当WebService调用任何异步方法时,使用Begin。是否仍然需要检查异步方法是否正确完成或超时?我得到“检查”的唯一方法是在结束时执行try/catch方法。如果由于超时而触发,它将引发异常。但我想知道是否有某种属性或方法可以告诉我webservice调用是否超时或处理是否正确。这里使用的webservice方法是“IsAlive”

3)有没有办法取消webservice异步操作?比如“取消直播”。我找到的唯一方法是Webservice.Abort。但我不认为这是一个最佳做法,因为它不是具体的,它可能会把一切搞砸


提前感谢,Luís Henrique。

这就是我通常调用Web服务并控制它们的方法(假设您的ws函数需要一个字符串并返回一个字符串):

公共静态void CallSomeFunction(字符串SomeParameter、操作Ok、操作错误、活动上下文)
{
ThreadPool.QueueUserWorkItem((对象e)=>{
var proxy=新的YourProxyClass();
代理超时=10000;
试一试{
var res=proxy.YourFunction(SomeParameter);
RunOnUiThread(()=>Ok(res));
}
捕获(例外情况除外){
if(错误!=null)
RunOnUiThread(错误);
}
});
}

这就是我执行异步任务的方式,使用线程池进行同步调用,并在一切正常或错误时传递一些要执行的操作。此外,我正在传递一个上下文,以便在UI线程中执行“确定”和“错误”操作。

根据我的经验,Xamarin在绑定到Web服务时确实有很多问题。让一切正常工作的最佳机会是使用.net framework中的wsdl.exe工具生成.cs类代理并在程序中使用它。我就是这样使用它的,而且超时工作非常完美。我注意到了!稍后我会考虑生成一个类代理,但是如果达到了超时,那么如何检查异步方法呢?您是否需要执行try/catch以了解它是否达到超时限制或是否正常执行?老实说,我从不使用异步方法,因为它们给我带来了很多麻烦,我正在创建一个答案,显示我通常对代码所做的事情。我不做标记作为答案,因为我希望有人仍然会回答我的3个原始问题,但与此同时,虽然没有人这样做,我相信你的代码将帮助我很多,谢谢!
WebService.MainService.BeginIsAlive ((ar) => 
{ 
    try 
    { 
        bool result = WebService.MainService.EndIsAlive (ar); //If timedout will raise an exception. 
        RunOnUiThread (() => 
        { 
            Toast.MakeText (this, "Running as expected...", ToastLength.Long).Show();
        });

        StartActivity (typeof(OtherScreen));
    } 
    catch (Exception ex) 
    {
            //Probably timeout.
    }
}, null);
    public static void CallSomeFunction(string SomeParameter, Action<string> Ok, Action Error, Activity Context)
    {
        ThreadPool.QueueUserWorkItem ((object e) => {


            var proxy = new YourProxyClass();
            proxy.Timeout = 10000;

            try{

                var res = proxy.YourFunction(SomeParameter);
                Context.RunOnUiThread(() => Ok(res));

            }
            catch(Exception Ex){

                if(Error != null)
                    Context.RunOnUiThread(Error);

            }


        });
    }