كيفية إعادة توجيه إلى صفحة تسجيل الدخول من خدمة الإنترنت في مكالمة أجاكس؟

StackOverflow https://stackoverflow.com/questions/610699

سؤال

وأستخدمه مسج لاستدعاء خدمة ويب (* .asmx) الأساليب. يستخدم خدمة الإنترنت FormsAuthentication لتحديد ما إذا كانت مصادقة المستخدم الاستدعاء. أنا غير قادر على إرجاع رمز حالة إعادة توجيه من طريقة شبكة الإنترنت، ومنها مثلا.

[WebMethod(EnableSession=true)]
public Dictionary<string, object> GetArchivedFiles(int pageSize, int page)
{
    if(HttpContext.Current.User.Identity.IsAuthenticated && Session["UserId"] != null)
        // Do some computing and return a Dictionary.       

    // Method will fall through here if the user is not authenticated.
    HttpContext.Current.Response.StatusCode = (int) HttpStatusCode.Unauthorized;
    return null;
}

ولا يعمل إعادة توجيه، وأنا دائما الحصول على 500 خطأ خادم داخلي عند القيام بذلك. حاولت رموز مختلفة. ما هي الطريقة الموصى بها للذهاب إلى هنا؟ ولست بحاجة لقراءة المعلومات إعادة توجيه من جافا سكريبت وتحميل صفحة جديدة (أو ربما عرض الطريق AJAX مراقبة الدخول).

وأنا في الواقع الحصول على كائن JSON إلى الوراء، والتي تبدو مثل هذا:

{"Message":"Authentication failed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"
}

وحاولت تشغيل المصحح، لكنها لا تظهر أن يتم إدخال أي الأساليب. كما ترون في تتبع مكدس الذاكرة المؤقتة هو باطل ...

عند التذرع عازف الكمان كما طلب POST القياسية (لا مدعوم) تقوم بإرجاع استثناء في الواقع:

HTTP/1.1 500 Internal Server Error
Server: ASP.NET Development Server/9.0.0.0
Date: Wed, 04 Mar 2009 14:46:02 GMT
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Type: text/plain; charset=utf-8
Content-Length: 1739
Connection: Close

System.NotSupportedException: The type System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Object, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] is not supported because it implements IDictionary.
   at System.Xml.Serialization.TypeScope.GetDefaultIndexer(Type type, String memberInfo)
   at System.Xml.Serialization.TypeScope.ImportTypeDesc(Type type, MemberInfo memberInfo, Boolean directReference)
   at System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo source, Boolean directReference, Boolean throwOnError)
   at System.Xml.Serialization.ModelScope.GetTypeModel(Type type, Boolean directReference)
   at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type type, XmlRootAttribute root, String defaultNamespace)
   at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type type, XmlRootAttribute root)
   at System.Web.Services.Protocols.XmlReturn.GetInitializers(LogicalMethodInfo[] methodInfos)
   at System.Web.Services.Protocols.XmlReturnWriter.GetInitializers(LogicalMethodInfo[] methodInfos)
   at System.Web.Services.Protocols.MimeFormatter.GetInitializers(Type type, LogicalMethodInfo[] methodInfos)
   at System.Web.Services.Protocols.HttpServerType..ctor(Type type)
   at System.Web.Services.Protocols.HttpServerProtocol.Initialize()
   at System.Web.Services.Protocols.ServerProtocol.SetContext(Type type, HttpContext context, HttpRequest request, HttpResponse response)
   at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing)
هل كانت مفيدة؟

المحلول 3

ما فعلته كان للتخلص من رمز الحالة على الإطلاق، والعودة فقط null. يعود هناك طريقة قائمة فارغة إذا كان هناك أية ملفات، مع إجمالي عدد الصفحات من 0. ولكن إذا لم يتم مصادقة المستخدم، فإنها ترجع null، في مثل هذه الحالة يمكنني استخدام window.location لإعادة توجيه المتصفح إلى صفحة تسجيل الدخول.

نصائح أخرى

ويجب عدم توجيه من خدمة ويب. يجب أن إرجاع قيمة تشير إلى ما إذا كان يجب إعادة توجيه (<م> هذا يمكن أن يكون طريقة Authenticate منفصل أن إرجاع string، لو كان باطلا، فهذا يعني انها مصادقة، إذا لم يكن ذلك سوف تحتوي على URL إعادة توجيه ) ثم في جافا سكريبت، هل يمكن أن تحقق قيمة الإرجاع وإعادة توجيه نحو ملائم عن طريق تعيين الخاصية window.location.

وبالمناسبة، والوصول إلى خدمة ويب يجب أن لا تتطلب مصادقة.

وليس لدي خبرة وتحديدا مع asp.net لكن بشكل عام أنا أحب استخدام كائن ajaxResponse الذي له خصائص مثل "النجاح"، "المحتوى"، "errortype". ومن شأن تسجيل الدخول المطلوبة استجابة في هذه الحالة يكون نجاح "كاذبة" وerrortype "تسجيل الدخول"، أو ما اخترت. شفرة جافا سكريبت ثم يقرر كيفية التعامل مع الكائن عاد بناء على هذه الخصائص، تظهر للمستخدم نموذج تسجيل دخول أو إعادة توجيه إلى صفحة جديدة.

ورمي استثناء في خدمة ويب. قبض على هذا في المتصل وتوجيه الضرورة.

في الواقع، إذا مشاركتك إلى خدمات ويب (اياكس أو لا) تحتوي على "نوع المحتوى" رأس مع قيمة "التطبيق / سلمان، محارف = UTF-8"، ثم كومة ASMX سوف نرسل لك الوراء سلمان منسقة سلسلة مع استثناء من إعادة التوجيه من المفترض أن عادة ما نتوقع بما في ذلك رمز الحالة 401 (غير المصرح به)، ولكن، إذا كنت لا ترسل أي رأس نوع المحتوى، يمكنك أيضا الحصول على إعادة توجيه المتصفح إلى صفحة تسجيل الدخول إلى الاستجابة مع رمز الحالة OK و باستخدام اياكس، سوف تحصل على صفحة HTML تسجيل الدخول كرد.

ونأمل أن يساعد هذا على توضيح.

والتحيات

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top