2009-12-08 41 views
1

我在編程上做了與雅虎和谷歌openid握手。谷歌是好的,但雅虎引發空指針:nullpointer爲雅虎openid請求,但不是谷歌(dotnetopenid)

堆棧跟蹤:

System.NullReferenceException: Object reference not set to an instance of an object. 
    at DotNetOpenAuth.OpenId.Extensions.ProviderAuthenticationPolicy.PolicyResponse.DotNetOpenAuth.Messaging.IMessageWithEvents.OnReceiving() in c:\Users\andarno\git\dotnetopenid\src\DotNetOpenAuth\OpenId\Extensions\ProviderAuthenticationPolicy\PolicyResponse.cs:line 189 
    at DotNetOpenAuth.OpenId.ChannelElements.ExtensionsBindingElement.<GetExtensions>d__a.MoveNext() in c:\Users\andarno\git\dotnetopenid\src\DotNetOpenAuth\OpenId\ChannelElements\ExtensionsBindingElement.cs:line 209 
    at DotNetOpenAuth.OpenId.ChannelElements.ExtensionsBindingElement.ProcessIncomingMessage(IProtocolMessage message) in c:\Users\andarno\git\dotnetopenid\src\DotNetOpenAuth\OpenId\ChannelElements\ExtensionsBindingElement.cs:line 151 
    at DotNetOpenAuth.Messaging.Channel.ProcessIncomingMessage(IProtocolMessage message) in c:\Users\andarno\git\dotnetopenid\src\DotNetOpenAuth\Messaging\Channel.cs:line 906 
    at DotNetOpenAuth.OpenId.ChannelElements.OpenIdChannel.ProcessIncomingMessage(IProtocolMessage message) in c:\Users\andarno\git\dotnetopenid\src\DotNetOpenAuth\OpenId\ChannelElements\OpenIdChannel.cs:line 171 
    at DotNetOpenAuth.Messaging.Channel.ReadFromRequest(HttpRequestInfo httpRequest) in c:\Users\andarno\git\dotnetopenid\src\DotNetOpenAuth\Messaging\Channel.cs:line 377 
    at DotNetOpenAuth.OpenId.RelyingParty.OpenIdRelyingParty.GetResponse(HttpRequestInfo httpRequestInfo) in c:\Users\andarno\git\dotnetopenid\src\DotNetOpenAuth\OpenId\RelyingParty\OpenIdRelyingParty.cs:line 489 
    at DotNetOpenAuth.OpenId.RelyingParty.OpenIdRelyingParty.GetResponse() in c:\Users\andarno\git\dotnetopenid\src\DotNetOpenAuth\OpenId\RelyingParty\OpenIdRelyingParty.cs:line 478 
    at Friendsell.UI.Controllers.Auth.OpenIdReturnController.DoProcessRequest(IExecutionContext context) in C:\Development\Friendsell\Friendsell.UI\Controllers\Auth\OpenIdController.cs:line 41 
    at Bistro.Controllers.AbstractController.ProcessRequest(HttpContextBase context, IContext requestContext) in C:\Development\Bistro\Bistro.Core\Controllers\AbstractController.cs:line 41 
    at Bistro.Controllers.MethodDispatcher.InvokeMethodDirect(HttpContextBase context, String requestPoint, IContext requestContext) in C:\Development\Bistro\Bistro.Core\Controllers\MethodDispatcher.cs:line 221 
    at Bistro.Controllers.MethodDispatcher.InvokeMethod(HttpContextBase context, String requestPoint, IContext requestContext) in C:\Development\Bistro\Bistro.Core\Controllers\MethodDispatcher.cs:line 119 

調用代碼:

 var openid = new OpenIdRelyingParty(); 
     IAuthenticationRequest request = openid.CreateRequest(
      Identifier.Parse(
       GetEndpoint()), 
       new Realm(realm), 
       new Uri(returnUri)); 

     // Require some additional data 
     request.AddExtension(new ClaimsRequest 
     { 
      Email = DemandLevel.Require, 
      FullName = DemandLevel.Request, 
      PostalCode = DemandLevel.Request 
     }); 

     try 
     { 
      request.RedirectToProvider(); 
     } catch (ThreadAbortException) 
     { 
     } 

接收代碼(和異常的來源)

 var openId = new OpenIdRelyingParty(); 
     var response = openId.GetResponse(); <-- exception happens here 

給出了什麼?奇怪的是,雅虎一塊最近工作,我沒有改變庫版本...

回答

0

我想你想看看你的CreateRequest。你也不能捕獲ThreadAbortException,它會自我傳播。因此你需要抓住它兩次。

+0

它怎麼會導致這種異常? – kolosy 2009-12-08 04:57:45

+0

閱讀下面的鏈接後,看起來好像無法傳遞正確的數據。這反過來回答你的評論,CreateRequest方法正在接收清空數據。如果你問的是ThreadAbortException,你就是那個試圖抓住它的人:) – Woot4Moo 2009-12-08 17:00:51