序列不包含元素

时间:2014-03-05 07:49:00

标签: c# asp.net .net linq dotnetopenauth

我使用DotNetOpenAuth进行了Google登录,但它工作正常,但突然间我得到了例外

Exception Details: System.InvalidOperationException: Sequence contains no elements

来源错误:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

堆栈追踪:

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

[ProtocolException: No OpenID endpoint found.]
   DotNetOpenAuth.OpenId.RelyingParty.OpenIdRelyingParty.CreateRequest(Identifier userSuppliedIdentifier, Realm realm, Uri returnToUrl) +296
   OpenIDGoogleLogin.Page_Load(Object sender, EventArgs e) +4626
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +51
   System.Web.UI.Control.OnLoad(EventArgs e) +92
   System.Web.UI.Control.LoadRecursive() +54
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +772

但有时它工作正常。我没有得到这个问题。请检查我获得例外的问题。

string discoveryUri = "https://www.google.com/accounts/o8/id";
OpenIdRelyingParty openid = new OpenIdRelyingParty();
string queryString = "";
var b = new UriBuilder(Request.Url) { Query = queryString };
var req = openid.CreateRequest(discoveryUri, b.Uri, b.Uri);
var fetchRequest = new FetchRequest();
fetchRequest.Attributes.AddRequired(WellKnownAttributes.Contact.Email);
fetchRequest.Attributes.AddRequired(WellKnownAttributes.Name.First);
fetchRequest.Attributes.AddRequired(WellKnownAttributes.Name.Last);
req.AddExtension(fetchRequest);
req.RedirectToProvider();

3 个答案:

答案 0 :(得分:1)

出现此错误是因为列表中没有元素而您尝试使用单个元素。 在使用之前检查列表是否为null,或者确保列表应包含至少一个元素。

答案 1 :(得分:1)

就我而言,这是由于网络应用程序无法与Google联系(使用Google OpenId的ASP.NET需要直接与www.google.com/accounts通信,而不仅仅是302重定向)。

我在1and1上主持。在1and1 IIS上运行的应用程序无法直接联系不在同一服务器上的网站。我一直在使用他们提供的代理。我的Web应用程序需要Google和另一个1and1网址上的另一个WCF Web服务。突然间,除非我删除了1and1代理,否则WCF服务突然停止工作。但删除代理意味着无法联系Google。

所以我放回了1and1代理,但修改了WCF绑定配置以绕过代理,并使用Google帐户进行身份验证再次工作!

希望这能为您解决问题提供线索。

答案 2 :(得分:0)

在我的情况下:用调谐器将Asp.Net控制器作为Soap和Wcf公开,我需要实现一个新适配器。但是我忘了写“

ServiceContract

”属性添加到界面上。它的工作原理如下

[ServiceContract]
public interface IRESAdapterService
{
    [return: XmlElement("GetCategoriesResponse")]
    [OperationContract(Action = "urn:GetCategories")]
    [XmlSerializerFormat(SupportFaults = true)]
    [FaultContract(typeof(RESAdapterServiceFault))]
    Task<CategoryResponse> GetCategoriesRequest();
}