क्या ASP.NET MVC में X-HTTP- विधि ओवरराइड को लागू करना संभव है?




asp.net-mvc rest (7)

प्रपत्र में डालें:

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

मैं एएसपी.नेट एमवीसी का उपयोग कर एक रीस्टाइम एपीआई के प्रोटोटाइप को लागू कर रहा हूं और यहाँ पर अजीब बग़ैर और यहां से मैंने शुरूआत में निर्धारित सभी आवश्यकताओं को हासिल किया है, कॉलर्स को X-HTTP-Method-Override HTTP विधि को ओवरराइड करने के लिए X-HTTP-Method-Override कस्टम शीर्षलेख

मैं क्या चाहता हूं कि निम्नलिखित अनुरोध ...

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

... मेरे नियंत्रक पद्धति को भेजा जाएगा जो उस कार्यवाही के लिए GET कार्यक्षमता के बजाय DELETE कार्यक्षमता लागू करता है (यह मानते हुए कि कार्रवाई को लागू करने के कई तरीके हैं, और वे अलग [AcceptVerbs] विशेषताओं के साथ चिह्नित हैं)। इसलिए, निम्न दो विधियों को देखते हुए, मैं चाहूंगा कि उपरोक्त अनुरोध दूसरे को भेजा जाए:

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

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

क्या किसी को पता है कि यह संभव है? और ऐसा करने के लिए कितना काम होगा ...?


आप एक एक्शनफिल्टर बना सकते हैं जो ऑनएक्शनएक्शीस्टिंग को लागू करता है, जो नियंत्रक की कार्रवाई से पहले आग लगती है। तब आप अनुरोध शीर्षकों से पूछताछ कर सकते हैं, और वर्तमान में जब X-HTTP-Method-Override हेडर के मूल्य के आधार पर रीडायरेक्ट कर सकते हैं।


यह वार्तालाप थोड़ा पुराना है, लेकिन मैं एमवीसी 2 का उपयोग करने के लिए जो कुछ मिला है उसे साझा करना चाहता था:

ब्राउज़र दो एचटीटीपी क्रियाओं का समर्थन करते हैं: प्राप्त करें और पोस्ट करें, लेकिन एएसपी.नेट एमवीसी 2 आपको एचटीएमएल। एचटीपीएमडाओवरराइड सहायक पद्धति का उपयोग कर रखें, प्राप्त करें और हटाएं अनुकरण करने की अनुमति देता है। आंतरिक रूप से, यह एक्स-एचटीपी-विधि-ओवरराइड फॉर्म फ़ील्ड में क्रिया भेजकर काम करता है। HttpMethodOverride का व्यवहार [AcceptVerbs] विशेषता के साथ ही नए छोटे क्रिया विशेषताओं द्वारा उपयोग किया जाता है:

उदाहरण के लिए, कार्रवाई घोषणा:

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

को आपके प्राप्त अनुरोध के लिए ज़िम्मेदारी लेनी चाहिए जिसमें X-HTTP- विधि ओवरराइड सेट को हटाएं।


मुझे आश्चर्य है कि इसका उल्लेख अभी तक नहीं हुआ है, लेकिन एएसपी.नेट एमवीसी ने एक्स-एचटीपी-विधि-ओवरराइड का मूल रूप से समर्थन किया है और कम से कम संस्करण 2 से ऐसा कर रहा है। इस को संभालने के लिए कस्टम कोड लिखने की कोई आवश्यकता नहीं है।

यह निम्नलिखित तरीके से काम करता है:

इनसाइडवेबेट्सटेट (इसके अलावा [एचटीपीपीट], [एचटीटीपीपोस्ट] आदि द्वारा प्रॉक्सी किया गया है), वहाँ एक IsValidForRequest विधि है। उस पद्धति के अंदर, यह Request.GetHttpMethodOverride () के साथ जांचता है, जो निम्नलिखित परिस्थितियों के साथ उचित ओवरराइडन HTTP विधि देता है:

  • ओवरराइड केवल पोस्ट अनुरोधों में समर्थित है सभी दूसरों को नजरअंदाज कर दिया जाता है
  • यदि X-HTTP- विधि ओवरराइड मान GET या POST है, तो इसे अनदेखा किया गया है। यह समझ में आता है, क्योंकि आपको इन मूल्यों के साथ ओवरराइड करने की आवश्यकता नहीं होती है
  • यह प्राथमिकता में निम्न स्थानों में एक्स-एचटीटीपी-विधि-ओवरराइड के लिए दिखता है: 1) HTTP हैडर 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;
    }
}

X-HTTP-Method- ओवरराइड एक कस्टम हेडर है और संभवतः आपके वेब कंटेनर द्वारा समर्थित नहीं है

क्या आप इसे एक वेब पेज से बुला रहे हैं? यदि हां, तो शायद आप डेल्ले के साथ XmlHttpRequest का उपयोग करना चाहिए (या जो क्रिया आप चाहते हैं)। बेहतर अभी तक, आपके लिए भारी भार उठाने के लिए जेएस फ्रेमवर्क का उपयोग करें


लेवी का जवाब महान है इसके अतिरिक्त, मैंने कस्टम AcceptsVerbsAttribute में एक चेक जोड़ दिया है जो कि FORM संग्रहण की भी जांच करता है, ताकि आप DELETE को ट्रिगर करने के लिए आसानी से एक गुप्त इनपुट डाल Html.HttpMethodOverride(HttpVerbs.Delete) MVC 2 के Html.HttpMethodOverride(HttpVerbs.Delete)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;

इस दृष्टिकोण से सावधान रहें! स्टीफन वाल्थर द्वारा संबंधित पोस्ट देखें

उम्मीद है कि यह किसी को मदद करता है


आप [AcceptVerbs] विशेषता का उपयोग करने में सक्षम नहीं होंगे क्योंकि यह अनुरोध के वास्तविक HTTP क्रिया से जुड़ा है। सौभाग्य से [AcceptVerbs] विशेषता बहुत सरल है; आप http://www.codeplex.com/aspnet/SourceControl/changeset/view/21528#266431 पर अपने लिए स्रोत देख सकते हैं

संक्षेप में, उपवर्ग स्वीकार करता है वर्शे गुण और IsValidForRequest () विधि को ओवरराइड करें। कार्यान्वयन निम्नलिखित की तरह होगा:

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




http-method