【问题标题】:Possible authentication problem? Loading a JSON via WebClient in Silverlight 4可能的身份验证问题?在 Silverlight 4 中通过 WebClient 加载 JSON
【发布时间】:2009-12-02 11:47:27
【问题描述】:

我正在使用 Silverlight 4,当我的页面加载时,我会调用

beginGet("my/people/", new OpenReadCompletedEventHandler(continueLoadStamData));

我定义为

private void beginGet(string endpoint, OpenReadCompletedEventHandler callback)
{
  WebClient wc = new WebClient();
  wc.Credentials = new NetworkCredential(username, password);
  wc.OpenReadCompleted += callback;
  wc.OpenReadAsync(new Uri(baseURL + endpoint));
}

然后继续LoadStamData()

void continueLoadStamData(object sender, OpenReadCompletedEventArgs e)
{
  JsonObject root = (JsonObject)JsonObject.Load(e.Result);
}

我的问题是,当我到达 e.Result 时,它会引发异常。这与我尝试使用 WebRequest req = ...; req.Credentials = new NetworkCredential(username, password) 时遇到的异常相同:

{System.Reflection.TargetInvocationException: An exception occurred during the operation, making the result invalid.  Check InnerException for exception details. ---> System.Net.WebException: An exception occurred during a WebClient request. ---> System.NotImplementedException: This property is not implemented by this class.
   at System.Net.WebRequest.set_Credentials(ICredentials value)
   at System.Net.WebClient.GetWebRequest(Uri address)
   at System.Net.WebClient.OpenReadAsync(Uri address, Object userToken)
   --- End of inner exception stack trace ---
   --- End of inner exception stack trace ---
   at System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary()
   at System.Net.OpenReadCompletedEventArgs.get_Result()
   at JSONSample.MainPage.continueLoadStamData(Object sender, OpenReadCompletedEventArgs e)
   at System.Net.WebClient.OnOpenReadCompleted(OpenReadCompletedEventArgs e)
   at System.Net.WebClient.OpenReadOperationCompleted(Object arg)}

您知道发生了什么吗?如何确保基本身份验证已实施并让我的请求继续执行?

干杯

尼克

【问题讨论】:

    标签: c# silverlight silverlight-4.0 webclient credentials


    【解决方案1】:

    基于Mark Monster's post here,您的 beginGet 方法中缺少一些代码行。它应该是这样的:

    private void beginGet(string endpoint, OpenReadCompletedEventHandler callback)
    {
      WebRequest.RegisterPrefix("http://", System.Net.Browser.WebRequestCreator.ClientHttp);  
      WebClient wc = new WebClient();  
      wc.Credentials = new NetworkCredential(username, password);
      wc.UseDefaultCredentials = false; 
      wc.OpenReadCompleted += callback;  
      wc.OpenReadAsync(new Uri(baseURL + endpoint));
    }
    

    另外,如果您只是想从服务器获取 JSON,您应该能够使用 DownloadStringAsync 而不是 OpenReadAsync,这可能会简化事情。

    【讨论】:

    • 非常感谢,我会试试看 :-)
    • 这是 Mark 的一篇很棒的博文。我给他发了一条评论,因为我没有让他的例子起作用,但是当我让它起作用时,这看起来很棒。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 2014-07-19
    • 2020-04-24
    相关资源
    最近更新 更多