Webサービスに簡単なリクエストを送信しようとしています。コードはUIスレッドではなく、バックグラウンドで実行されます。URIには、常に200HTTPコードで結果を返す正しいアドレスが含まれています。すべてがエミュレーターで実行されます。
var request = WebRequest.Create(uri);
try
{
var ar = request.BeginGetResponse(_ => { }, null);
using (var response = request.EndGetResponse(ar)) //NullReferenceException rises here
using (var stream = response.GetResponseStream())
{
var serializer = new DataContractJsonSerializer(typeof(AuthResult));
return (AuthResult)serializer.ReadObject(stream);
}
}
catch (Exception e)
{
return new AuthResult { Error = e.Message };
}
デバッガコードがないと常に失敗します。デバッガーを接続すると、失敗することはめったにありません。
System.NullReferenceException occurred
Message=NullReferenceException
StackTrace:
at System.Net.Browser.ClientHttpWebRequest.InvokeGetResponseCallback(Object state)
at System.Net.Browser.ClientHttpWebRequest.Completed(Object sender, EventArgs e)
at MS.Internal.InternalWebRequest.OnCompleted(Object sender, EventArgs args)
at MS.Internal.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex, Delegate handlerDelegate, Object sender, Object args)
at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)
そして次のもの:
System.Net.WebException occurred
Message=The remote server returned an error: NotFound.
StackTrace:
at System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at Contest.InteropApi.SignIn(Uri uri)
at Contest.ViewModel.LoginViewModel.<PerformSignIn>b__4()
at System.Reactive.Linq.QueryLanguage.<>c__DisplayClass3b`1.<>c__DisplayClass3d.<ToAsync>b__3a()
at System.Reactive.Concurrency.Scheduler.Invoke(IScheduler scheduler, Action action)
at System.Reactive.Concurrency.DefaultScheduler.<>c__DisplayClass1`1.<Schedule>b__0(Object _)
at System.Reactive.Concurrency.ConcurrencyAbstractionLayerImpl.<>c__DisplayClasse.<QueueUserWorkItem>b__d(Object _)
at System.Threading.ThreadPool.WorkItem.WaitCallback_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadPool.WorkItem.doWork(Object o)
at System.Threading.Timer.ring()