2013-04-04 23 views
7

Próbuję użyć Google OpenID z aplikacją MVC 4 hostowaną na platformie Azure &, która ciągle się zawiesza. Ale nie od razu. Kiedy wdrażam aplikację, wszystko działa idealnie za każdym razem. Zostawiam to na pewien czas, zwykle na dzień, ale może to być godzina &, a następnie spróbuj ponownie & za każdym razem zawodzi. Następnie odśwież, wróć do strony głównej, która przesyła cię do strony logowania.Dostawca Google OpenID konsekwentnie zawiesza się na platformie Azure

błąd jest:

[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 

mój kod, który wywołuje żądanie jest:

//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(); 
    } 

nie wprowadził żadnych dodatków do pliku web.config, inny niż w ustawieniach konfiguracyjnych proxy gdzie indziej rekomendowanych . Nie wydaje się, żeby to miało jakikolwiek wpływ.

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

Używam najnowszych pakietów 4.2.2 z nuget.

+0

Czy możesz wskazać zasoby, które zalecają konfigurację proxy? – astaykov

+0

Właściwie to tutaj. http://stackoverflow.com/questions/10062322/google-openid-no-openid-endpoint-found-intermittent?rq=1 –

+0

Nadal nie mogę tego zrobić. Doprowadza mnie do szału –

Odpowiedz

3

Wygląda więc na to, że zwiększono limity czasu, zgodnie z sugestią here. Ustawiłem moje wartości wyżej, zgodnie z sugestią, ale oczywiście możesz przetestować najbardziej odpowiednie wartości.

Zmieniłem również kod. Zauważysz, że powyżej klasy znajduje się zmienna statyczna dla strony odpowiadającej. Zmieniłem to jako zmienną instancji, ponieważ nie widziałem powodu, aby używać tego wzorca. Przykładowy kod dla DotNetOpenAuth nie używa statycznych instancji dla klasy Odpowiadająca strona.

O ile nikt nie może zasugerować, dlaczego posiadanie go jako statycznego może być dobrym pomysłem, zostawię go w niezmienionym stanie.