Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WebRequest BeginGetResponse/EndGetResponse在使用Task.FromAsync时引发异常_C#_Asynchronous_Windows Phone 8_Async Await_Webrequest - Fatal编程技术网

C# WebRequest BeginGetResponse/EndGetResponse在使用Task.FromAsync时引发异常

C# WebRequest BeginGetResponse/EndGetResponse在使用Task.FromAsync时引发异常,c#,asynchronous,windows-phone-8,async-await,webrequest,C#,Asynchronous,Windows Phone 8,Async Await,Webrequest,我尝试使用WebRequest将POST操作异步化到RESTWeb服务 因此,据我所知,我需要使用Task.Factory.fromsync(BeginXyz,EndXyz,null),它似乎适用于GetRequestStream对方法,因为我没有得到任何异常,字节[]充满了值 Stream requestStream = await Task.Factory.FromAsync<Stream>( request.BeginGetReq

我尝试使用WebRequest将POST操作异步化到RESTWeb服务

因此,据我所知,我需要使用
Task.Factory.fromsync(BeginXyz,EndXyz,null)
,它似乎适用于
GetRequestStream
对方法,因为我没有得到任何异常,字节[]充满了值

Stream requestStream = await Task.Factory.FromAsync<Stream>(
                        request.BeginGetRequestStream, request.EndGetRequestStream, null);
byte[] postBytes = Encoding.UTF8.GetBytes(requestData);
await requestStream.WriteAsync(postBytes, 0, postBytes.Length);
Stream requestStream=wait Task.Factory.fromsync(
request.BeginGetRequestStream,request.EndGetRequestStream,null);
byte[]postBytes=Encoding.UTF8.GetBytes(requestData);
wait requestStream.WriteAsync(postBytes,0,postBytes.Length);
很好,上面的代码正在运行,下一部分抛出异常

WebResponse webResponse = await Task.Factory.FromAsync<WebResponse>(
                        request.BeginGetResponse, request.EndGetResponse, null);
WebResponse WebResponse=wait Task.Factory.fromsync(
request.BeginGetResponse,request.EndGetResponse,null);
每个请求都有例外

System.NotSupportedException:不支持指定的方法

堆栈跟踪:

位于System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod,对象状态)位于 System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)在System.Func`2.Invoke(T arg)在 System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar,Func`2 endFunction,Action`1 endAction,Task`1 promise,布尔值 要求(同步) ---来自引发异常的上一个位置的堆栈结束跟踪---在 System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()中 在 Gtas.Core.ServiceRepository.d_u8.MoveNext()

InnerException堆栈跟踪:位于 System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult 异步结果)在 System.Net.Browser.ClientHttpWebRequest.c_uuDisplayClasse.b_uud(对象 发送状态)在 System.Net.Browser.AsyncHelper.c__DisplayClass1.b__0(对象 发送国)

执行请求的完整代码如下所示:

Stream requestStream = await Task.Factory.FromAsync<Stream>(
                        request.BeginGetRequestStream, request.EndGetRequestStream, null);
byte[] postBytes = Encoding.UTF8.GetBytes(requestData);
await requestStream.WriteAsync(postBytes, 0, postBytes.Length);


WebResponse webResponse = await Task.Factory.FromAsync<WebResponse>(
                        request.BeginGetResponse, request.EndGetResponse, null);
Stream streamResponse = webResponse.GetResponseStream();
StreamReader streamRead = new StreamReader(streamResponse);
string responseString = await streamRead.ReadToEndAsync();
// ... Do something with the result data
Stream requestStream=wait Task.Factory.fromsync(
request.BeginGetRequestStream,request.EndGetRequestStream,null);
byte[]postBytes=Encoding.UTF8.GetBytes(requestData);
wait requestStream.WriteAsync(postBytes,0,postBytes.Length);
WebResponse WebResponse=wait Task.Factory.fromsync(
request.BeginGetResponse,request.EndGetResponse,null);
streamResponse=webResponse.GetResponseStream();
StreamReader streamRead=新的StreamReader(streamResponse);
string responseString=等待streamRead.ReadToEndAsync();
// ... 对结果数据做些什么
我不太明白错误是什么

我从stackoverflow和一些MSDN帖子中尝试了几个实现。似乎什么都不管用

使用回调可以很好地工作。但很高兴知道为什么我不能让它工作

你有没有想过如何做到这一点

  • 尝试在requestStream.WriteAsync之后使用或调用requestStream.Close()来包围requestStream
  • 检查请求。Method=“POST”;没有丢失

  • 不确定是否存在内存泄漏,但

    WebResponse response = null;
    using (var stream = await 
    Task<Stream>.Factory.FromAsync(request.BeginGetResponse, result =>
    {
        response = request.EndGetResponse(result);
        return response.GetResponseStream();
    }, request))
    {
        // TODO
    }
    response.Dispose();
    
    WebResponse=null;
    使用(var stream=wait)
    Task.Factory.fromsync(request.BeginGetResponse,result=>
    {
    response=request.EndGetResponse(结果);
    返回response.GetResponseStream();
    }(请求)
    {
    //待办事项
    }
    response.Dispose();
    
    为什么您不使用像HttpClient这样支持异步/等待开箱即用的东西?您好,这会救我的命,但因为这是一个要分发的库,所以我不能使用第三方库,这意味着最终用户将需要两个库。至少在我的情况下,依赖性是不好的!这意味着HttpClient只能通过NuGet获得。
    NotSupportedException
    似乎表明Xamarin的支持中缺少了一些东西。你问过他们吗?(Async仍在那里预发布)。Stephen:)您已经注意到Xamarin这个词,说实话,是的,我使用Xamarin项目中的共享代码,但实现是针对Windows Phone 8的,对此很抱歉,我只使用相同的名称空间。@George Taskos,我正在使用Xamarin.Forms在VS premium 2013中为WP runtime开发。在我的PCL项目中,我也得到了与您在上面给出的相同的异常。它适用于Android和iOS。如何修复它?如果你能把你的答案贴在这里会很有帮助。