【问题标题】:Using Portable Class Library with Webrequest and WP8使用带有 Webrequest 和 WP8 的可移植类库
【发布时间】:2012-11-09 01:35:31
【问题描述】:

我有一个问题我找不到任何解决方案,而且我很难相信我是唯一遇到此错误的人。

我在可移植类库中有这段 C# 代码

static public void GetAnimeListFromWeb(ObservableCollection<AnimeViewModel> collection, string Url, string encodedLogin = "")
    {
        WebRequest request = WebRequest.Create(Url);
        request.Headers["Authorization"] = encodedLogin;

        IAsyncResult asyncResult = request.BeginGetResponse(new AsyncCallback( s => {
            WebResponse response = (s.AsyncState as WebRequest).EndGetResponse(s);
            XDocument doc = XDocument.Load(response.GetResponseStream());

            IEnumerable<AnimeViewModel> result = ParseAnimeXML(doc);

            collection = (ObservableCollection<AnimeViewModel>)result;

        }), request);
    }

当我编译它时,它会构建,并且代码也可以在我编写的用于测试它的小型控制台程序中运行。但是,在 Windows Phone 8 应用程序中进行测试时,它会崩溃

WebResponse response = (s.AsyncState as WebRequest).EndGetResponse(s);

它抛出一个 ArgumentException。当我检查 's' 变量时,它说 AsyncWaitHandle 给出了 NotSupportedException。

那么我的问题是,我怎样才能做出适用于所有平台的正确 Webrequest?

编辑:注意我的目标是 .NET 4.5、SL4 及更高版本、WP7 及更高版本以及适用于 Windows 应用商店应用程序的 .NET 可能很有用

【问题讨论】:

  • 我无法重现这个。忽略 AsyncWaitHandle,这是一个红鲱鱼,并且不相关(我们只是不支持等待异步结果)。那是上面的确切复制吗? ArgumentException 实际上是否来自 EndGetResponse?当您传递一个与 request.BeginGetResponse 方法不完全一致的 IAsyncResult 时,它会引发 ArgumentException。
  • 是的,这正是它崩溃的代码,用不同的语法对其进行了多次测试,但它都在该行崩溃,说 AsyncWaitHandle 抛出了 NotSupportedException
  • 让我们退后一步。您可以尝试在独立的 Windows Phone 8 项目中重新制作以排除可移植类库吗?模拟器中会出现这种情况吗?如果是这样,哪个模拟器,Windows Phone 7 或 Windows Phone 8?
  • 我在更好地调查错误时发现了这个问题。它崩溃是因为 Authorization 标头有一个空字符串,这显然使它崩溃。而且我确实在使用一个模拟器,WP8 WXGA。

标签: c# .net windows-phone-8 portable-class-library


【解决方案1】:

在我看来,您需要使用最新的 Asyc/Await 概念来执行此任务,例如 DownloadStringAsync。因为 Async/Await 是 Windows 8 和 Windows Phone 8 中唯一支持的机制。但是,当您使用此代码并为多个平台构建它时,编译器将处理不同平台的复杂性并生成所需的代码。

【讨论】:

  • 这不正确。 Windows Phone 8 支持 BeginXXX 和 EndXX 。这也与编译器无关,无论使用 Windows 8、Phone 8 还是 Portable,编译器都会生成相同的代码。
  • 感谢指正。我的假设是错误的。我认为异步调用的唯一方法是 Async/await。
  • 如果你有一个装有 windows phone 7.5 及更高版本的 pcl,你可以使用它来添加异步支持:Microsoft.Bcl.Async (blogs.msdn.com/b/bclteam/archive/2012/11/22/…)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 2018-07-06
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多