2013-04-04 105 views
7

我正嘗試使用Google OpenID和Azure &上託管的MVC 4應用程序,但它一直失敗。雖然不是直接的。當我部署應用程序時,它一次又一次地完美運行。然後我離開它一段時間,通常是一天,但可能是一小時&然後再試一次&它每次都會失敗。然後刷新,返回主頁,它將您發送到登錄頁面&它再次工作。谷歌OpenID提供商在Azure上一直失敗

的錯誤是:

[InvalidOperationException: Sequence contains no elements] 
    System.Linq.Enumerable.First(IEnumerable`1 source) +498 
    DotNetOpenAuth.OpenId.RelyingParty.OpenIdRelyingParty.CreateRequest(Identifier userSuppliedIdentifier, Realm realm, Uri returnToUrl) +106 

[ProtocolException: No OpenID endpoint found.] 
    DotNetOpenAuth.OpenId.RelyingParty.OpenIdRelyingParty.CreateRequest(Identifier userSuppliedIdentifier, Realm realm, Uri returnToUrl) +303 
    Tools.Helpers.GoogleApps.Login(Uri returnUrl) in c:\Users\Simon\Documents\Visual Studio 2012\Projects\Internal Utils\Website\Helpers\GoogleApps.cs:33 
    Tools.Helpers.ExternalLoginResult.ExecuteResult(ControllerContext context) in c:\Users\Simon\Documents\Visual Studio 2012\Projects\Internal Utils\Website\Helpers\ExternalLoginResult.cs:25 
    System.Web.Mvc.<>c__DisplayClass1a.<InvokeActionResultWithFilters>b__17() +33 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +613 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +263 
    System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +230 
    System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +28 
    System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +20 
    System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +53 
    System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +20 
    System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +42 
    System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +20 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +469 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +375 

我的代碼觸發請求是:

//constructor 
    static GoogleApps() 
    { 
     var googleAppDiscovery = new HostMetaDiscoveryService 
     { 
      UseGoogleHostedHostMeta = true, 
     }; 

     RelyingParty = new OpenIdRelyingParty(); 
     RelyingParty.DiscoveryServices.Insert(0, googleAppDiscovery); 
    } 

    public void Login(Uri returnUrl) 
    { 
     var realm = new Realm(returnUrl.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped)); 

     var request = RelyingParty.CreateRequest("my.domain.name", realm, returnUrl); 

     var fetch = new FetchRequest(); 
     fetch.Attributes.Add(new AttributeRequest(WellKnownAttributes.Contact.Email, true)); 
     fetch.Attributes.Add(new AttributeRequest(WellKnownAttributes.Name.First, true)); 
     fetch.Attributes.Add(new AttributeRequest(WellKnownAttributes.Name.Last, true)); 
     request.AddExtension(fetch); 

     request.RedirectToProvider(); 
    } 

我還沒有添加任何額外的web.config中,比其他地方推薦代理配置設置等。似乎沒有任何區別。

<defaultProxy enabled="true"> 
    <proxy autoDetect="True" usesystemdefault="True" /> 
</defaultProxy> 

我使用的是來自nuget的最新4.2.2軟件包。

+0

你能指出推薦代理配置的資源嗎? – astaykov 2013-04-05 07:11:00

+0

其實在這裏。 http://stackoverflow.com/questions/10062322/google-openid-no-openid-endpoint-found-intermittent?rq=1 – 2013-04-05 16:34:31

+0

我仍然無法完成這項工作。現在讓我生氣了 – 2013-06-09 14:08:17

回答

3

所以它看起來像增加超時使它工作,建議here。我建議我的值更高,但顯然你可以測試最合適的值。

我也改變了我的代碼。你會發現在類的上面包含一個應答方的靜態變量。我改變這是一個實例變量,因爲我沒有理由使用這種模式。 DotNetOpenAuth的示例代碼不會爲Replying Party類使用靜態實例。

除非任何人可以建議爲什麼把它作爲一個靜態可能是一個好主意,我會保持原樣。