asp.net mvc هل من الممكن تنفيذ X-هتب-ميثود-أوفيريد في ASP.NET مفك؟




asp.net-mvc rest (7)

هل نظرت في التوجيه ببساطة بسيطة ؟ انها تفعل ذلك بالفعل.

تحرير فبراير 2010 لإضافة: يتم تضمين أوفيريدس طريقة في مفك 2.

أنا تنفيذ نموذج أولي أبي ريستفول باستخدام ASP.NET مفك وبصرف النظر عن علة غريبة هنا وهناك لقد X-HTTP-Method-Override جميع المتطلبات التي وضعت في البداية، وبصرف النظر عن المتصلين أن تكون قادرة على استخدام X-HTTP-Method-Override رأس مخصص لتجاوز طريقة هتب.

ما أوده هو أن الطلب التالي ...

GET /someresource/123 HTTP/1.1
X-HTTP-Method-Override: DELETE

... سيتم إرسالها إلى أسلوب وحدة التحكم التي تقوم بتنفيذ وظيفة DELETE بدلا من وظيفة GET لهذا الإجراء (على افتراض أن هناك أساليب متعددة تنفيذ الإجراء، وأن يتم وضع علامة عليها مع سمات [AcceptVerbs] مختلفة. لذلك، نظرا للطريقتين التاليتين، أود أن ترسل الطلب أعلاه إلى الثانية:

[ActionName("someresource")]
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult GetSomeResource(int id) { /* ... */ }

[ActionName("someresource")]
[AcceptVerbs(HttpVerbs.Delete)]
public ActionResult DeleteSomeResource(int id) { /* ... */ }

لا أحد يعرف إذا كان هذا ممكنا؟ وما هو مقدار العمل الذي يجب القيام به ...؟


الجواب ليفي هو عظيم. بالإضافة إلى ذلك، أضفت شيك في مخصصات مقبولة فيربساتريبوت الذي يدرس أيضا مجموعة فورم، لذلك يمكنك ببساطة إدخال إدخال مخفي لتشغيل ديليت (على غرار Html.HttpMethodOverride(HttpVerbs.Delete) ).

<input name="X-HTTP-Method-Override" type="hidden" value="DELETE" />

تغيير مهمة وندكومفيرب إلى:

string incomingVerb = controllerContext.HttpContext.Request.Headers["X-HTTP-Method-Override"] ?? controllerContext.HttpContext.Request.Form["X-HTTP-Method-Override"] ??controllerContext.HttpContext.Request.HttpMethod;

كن حذرا مع هذا النهج! انظر مشاركة ذات صلة من قبل ستيفن والثر.

نأمل أن يساعد هذا الشخص.


أنا مندهش أن هذا لم يذكر حتى الآن، ولكن ASP.NET مفك أصلا يدعم X-هتب-طريقة تجاوز وقد تم القيام بذلك من على الأقل الإصدار 2. ليس هناك حاجة لكتابة رمز مخصص للتعامل مع هذا.

وهي تعمل بالطريقة التالية:

داخل أسيبتفربساتاتريبوت (أيضا بروكسيد بواسطة [هتبوت]، [هتبوست]، الخ)، هناك أسلوب إسفالديفوركست. داخل هذه الطريقة، فإنه يتحقق مع request.GetHttpMethodOverride ()، التي ترجع الأسلوب هتب أوفيريدن السليم مع الشروط التالية:

  • يتم دعم التجاوز فقط في طلبات بوست. يتم تجاهل جميع الآخرين.
  • إذا كانت قيمة X-هتب-ميثود-أوفيريد هي جيت أو بوست، فسيتم تجاهلها. وهذا أمر منطقي، لأنك لن تحتاج أبدا إلى تجاوز هذه القيم.
  • وهي تبحث عن X-هتب-ميثود-أوفيريد في الأماكن التالية في هذه الأولوية: 1) هتب هيدر 2) فورم بودي 3) سلسلة طلب البحث

إذا كنت حقا غريبة، وهنا كيف جيثتبميثودوفيريد () يبدو (من شفرة المصدر مفك 3):

public static class HttpRequestExtensions {
    internal const string XHttpMethodOverrideKey = "X-HTTP-Method-Override";

    public static string GetHttpMethodOverride(this HttpRequestBase request) {
        if (request == null) {
            throw new ArgumentNullException("request");
        }

        string incomingVerb = request.HttpMethod;

        if (!String.Equals(incomingVerb, "POST", StringComparison.OrdinalIgnoreCase)) {
            return incomingVerb;
        }

        string verbOverride = null;
        string headerOverrideValue = request.Headers[XHttpMethodOverrideKey];
        if (!String.IsNullOrEmpty(headerOverrideValue)) {
            verbOverride = headerOverrideValue;
        }
        else {
            string formOverrideValue = request.Form[XHttpMethodOverrideKey];
            if (!String.IsNullOrEmpty(formOverrideValue)) {
                verbOverride = formOverrideValue;
            }
            else {
                string queryStringOverrideValue = request.QueryString[XHttpMethodOverrideKey];
                if (!String.IsNullOrEmpty(queryStringOverrideValue)) {
                    verbOverride = queryStringOverrideValue;
                }
            }
        }
        if (verbOverride != null) {
            if (!String.Equals(verbOverride, "GET", StringComparison.OrdinalIgnoreCase) &&
                !String.Equals(verbOverride, "POST", StringComparison.OrdinalIgnoreCase)) {
                incomingVerb = verbOverride;
            }
        }
        return incomingVerb;
    }
}

لن تتمكن من استخدام السمة [أسبتفيربس] كما هي لأنها مرتبطة بفعل هتب الفعلي للطلب. لحسن الحظ السمة [أسبتفيربس] بسيطة جدا. يمكنك أن ترى المصدر لنفسك في http://www.codeplex.com/aspnet/SourceControl/changeset/view/21528#266431 .

باختصار، سوبكلاس يقبل فيسبساتريبوت وتجاوز الأسلوب إسفالديفوركست (). وسيكون التنفيذ شيئا مما يلي:

string incomingVerb = controllerContext.HttpContext.Request.Headers["X-HTTP-Method-Override"] ?? controllerContext.HttpContext.Request.Method;
return Verbs.Contains(incomingVerb, StringComparer.OrdinalIgnoreCase);

إدراج إلى النموذج:

<%= Html.HttpMethodOverride(HttpVerbs.Delete) %>

يمكنك إنشاء أكتيونفيلتر تنفيذ أونكتيونكسكوتينغ، الذي يطلق قبل استدعاء إجراء وحدة التحكم. يمكنك بعد ذلك استجواب رؤوس الطلب وإعادة التوجيه استنادا إلى قيمة رأس X-هتب-ميثود-أوفيريد، عندما تكون موجودة.


هذه المحادثة قديمة بعض الشيء، ولكن أردت أن أشارك ما وجدت باستخدام مفك 2:

المتصفحات تدعم اثنين من الأفعال هتب: جيت و بوست، ولكن ASP.NET مفك 2 يسمح لك لمحاكاة وضع، الحصول على، وحذف باستخدام الأسلوب Html.HttpMethodOverride مساعد. داخليا، يعمل هذا عن طريق إرسال الفعل في حقل نموذج X-هتب-ميثود-أوفيريد. يتم استخدام سلوك هتبميثودوفيريد بواسطة السمة [أسبتفيربس] بالإضافة إلى سمات الفعل الأقصر الجديدة:

على سبيل المثال، إعلان الإجراء:

[ActionName("someresource")]
[HttpDelete]
public ActionResult DeleteSomeResource()

يجب أن تتحمل المسؤولية عن الحصول على طلب الذي يحتوي على X-هتب-ميثود-أوفيريد تعيين إلى حذف.





http-method