2013-04-04 20 views
7

Sto tentando di utilizzare Google OpenID con un'app MVC 4 ospitata su Azure & continua a non funzionare. Non subito però. Quando distribuisco l'app, tutto funziona perfettamente di volta in volta. Poi lo lascio per un po 'di tempo, di solito un giorno, ma potrebbe essere un'ora & quindi riprovare & fallisce ogni volta. Quindi si aggiorna, tornare alla homepage, che ti invia alla pagina di login & funziona di nuovo.Il provider OpenID di Google non riesce costantemente su Azure

l'errore è:

[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 

Il mio codice che fa scattare la richiesta è:

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

non ho aggiunto nulla in più al web.config, oltre alle impostazioni del proxy di configurazione consigliate altrove . Non sembra fare alcuna differenza.

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

Sto utilizzando gli ultimi pacchetti 4.2.2 da nuget.

+0

potresti puntare la risorsa che consiglia le configurazioni proxy? – astaykov

+0

In realtà qui su così. http://stackoverflow.com/questions/10062322/google-openid-no-openid-endpoint-found-intermittent?rq=1 –

+0

Non riesco ancora a farlo funzionare. Mi sta facendo impazzire ora –

risposta

3

Quindi sembra che aumentando i timeout ha funzionato, come suggerito here. Ho impostato i miei valori più alti come suggerito, ma ovviamente puoi testare i valori più appropriati.

Ho anche cambiato il mio codice. Noterai sopra la classe contiene una variabile statica per la parte che risponde. Ho cambiato questo per essere una variabile di istanza in quanto non ho visto alcun motivo per utilizzare questo modello. Il codice di esempio per DotNetOpenAuth non utilizza istanze statiche anche per la classe di Party di risposta.

A meno che nessuno possa suggerire perché averlo come statico potrebbe essere una buona idea, lo lascerò così com'è.