c# - 针对 Windows 10 UWP 时 PostAsync 引发 IRandomAccessStream 错误

标签 c# windows-runtime uwp

我正在将 Windows 8.1 应用移植到 Windows 10 UWP,但调用 PostAsync 现在会引发异常。

这段代码在面向 8.1 时完美运行,但当我面向 Windows 10 UWP 时,它会引发以下异常:

此 IRandomAccessStream 不支持 GetInputStreamAt 方法,因为它需要克隆,而此流不支持克隆。

代码

    public async void TestPost()
    {
        var parameters = GetParameters();
        var formattedData = new FormUrlEncodedContent(parameters);
        using (var clientHandler = new HttpClientHandler { Credentials = GetCredentials() })
        {
            using (var httpClient = new HttpClient(clientHandler))
            {
                var response = await httpClient.PostAsync(postUrl, formattedData);
            }
        }
    }

private Dictionary<string, string> GetParameters()
{
    var parameters = new Dictionary<string, string>();
    parameters["grant_type"] = "url";
    parameters["device_id"] = "unique key";
    parameters["redirect_uri"] = "redirect url";
    return parameters;
}

public static NetworkCredential GetCredentials()
{
    return new NetworkCredential("<secret key>", "");
}

堆栈跟踪

 at System.IO.NetFxToWinRtStreamAdapter.ThrowCloningNotSuported(String methodName)
   at System.IO.NetFxToWinRtStreamAdapter.GetInputStreamAt(UInt64 position)
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Net.Http.HttpHandlerToFilter.<SendAsync>d__1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Net.Http.HttpClientHandler.<SendAsync>d__1.MoveNext()

最佳答案

您是否尝试过使用 Windows.Web.Http.HttpClient 来代替?

// using Windows.Web.Http;
// using Windows.Web.Http.Filters;

var parameters = GetParameters();
var formattedData = new HttpFormUrlEncodedContent(parameters);
using (var clientHandler = new HttpBaseProtocolFilter())
{
    clientHandler.ServerCredential = GetCredentials();

    using (var httpClient = new HttpClient(clientHandler))
    {
        var response = await httpClient.PostAsync(postUrl, formattedData);
    }
}

关于c# - 针对 Windows 10 UWP 时 PostAsync 引发 IRandomAccessStream 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31774058/

相关文章:

c# - Java EE + JKS 与 C#

c# - 如何确定字符串是否是已安装 UWP 应用程序的 AUMID?

c# - 使用 MySQL Connector Net 6.7.9 从 UWP 到 MariaDB

c# - Windows 10 中的圆形 CaptureElement 相机流

c# - 创建虚拟 COM 端口

c# - 错误 "argument is value while parameter is declared as in"是什么意思?

C# "lock"关键字 : Why is an object necessary for the syntax?

c# - MediaCapture.StartPreviewToCustomSinkAsync 方法如何工作?

c# - 未检测到已安装的组件。元素已经是另一个元素的子元素

windows - 创建开发人员许可证后,我可以更改用于 Visual Studio 的 Microsoft 帐户吗?