2013-06-26 5 views
13

मेरी एमवीसी 3 नियंत्रक कार्रवाई से मैं HTTP 403 वापस करना चाहता हूं, कुछ विशिष्ट स्ट्रिंग में "स्थिति विवरण" सेट करना चाहता हूं और परिणाम सामग्री में उस स्ट्रिंग को भी वापस कर सकता हूं ताकि यह ब्राउज़र में दिखाई दे।मैं एमवीसी 3 में एक स्टेटस कोड, स्टेटस विवरण और टेक्स्ट कैसे एक साथ वापस कर सकता हूं?

मैं सामग्री निर्दिष्ट करने के लिए ContentResult वापस कर सकता हूं, लेकिन स्थिति कोड (जैसे 403) नहीं और स्थिति विवरण नहीं। मैं स्थिति कोड और स्थिति विवरण निर्दिष्ट करने के लिए HttpStatusCodeResult का उपयोग कर सकता हूं लेकिन परिणाम सामग्री नहीं।

मैं एक कार्य परिणाम कैसे तैयार करूं जिसमें तीनों शामिल हैं?

+1

कस्टम जेसन ({code: descr:}) कॉल का उपयोग क्यों नहीं करते? – Tigran

+1

@ टिग्रान: इस सरल उद्देश्य के लिए आईएमओ जो एक ओवरकिल होगा। – sharptooth

+0

जितना मुझे पता है, यह संभव नहीं है, इसलिए आपको esplicit composed object बनाने की आवश्यकता है। उस मामले में, आईएमओ, सबसे आसान समाधान कस्टम जेसन ऑब्जेक्ट है। लेकिन मैं एएसपी.NET विशेषज्ञ नहीं हूं, इसके लिए एक और आसान समाधान हो सकता है। – Tigran

उत्तर

9

यदि यह भी गंदा

Response.Clear(); 
Response.Write("Some specific string"); 
return new HttpStatusCodeResult(403, "another specific string"); 
+2

या इसी तरह, 'Response.StatusCode = 403; Response.StatusDescription = "foo"; वापसी सामग्री ("खराब अनुरोध साथी"); ' – drch

+2

यदि आप कोड से पहले इसके साथ गड़बड़ कर रहे हैं तो पहले प्रतिक्रिया को साफ़ करना न भूलें: 'Response.Clear();' – Haney

13

आमतौर पर आप इस प्रतिक्रिया कोड की स्थापना तो एक नियमित रूप से ActionResult

public ActionResult Foo() 
{ 
    Response.StatusCode = 403; 
    Response.StatusDescription = "Some custom message"; 

    return View(); // or Content(), Json(), etc 
} 

लौटने आप वास्तव में इस एक ActionResult होने की जरूरत है के द्वारा किया देखना होगा नहीं है, आप अपना खुद का बनाते हैं।

उदाहरण:

public class HttpStatusContentResult : ActionResult 
{ 
    private string _content; 
    private HttpStatusCode _statusCode; 
    private string _statusDescription; 

    public HttpStatusContentResult(string content, 
            HttpStatusCode statusCode = HttpStatusCode.OK, 
            string statusDescription = null) 
    { 
     _content = content; 
     _statusCode = statusCode; 
     _statusDescription = statusDescription; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     var response = context.HttpContext.Response; 
     response.StatusCode = (int) _statusCode; 
     if (_statusDescription != null) 
     { 
      response.StatusDescription = _statusDescription; 
     } 

     if (_content != null) 
     { 
      context.HttpContext.Response.Write(_content); 
     } 
    } 
} 
+3

यदि '_statusDescription' शून्य है, तो आप इसे 'HttpWorkerRequest.GetStatusDescription (response.StatusCode)' का मान असाइन कर सकता है, जो हुड के तहत 'स्ट्रिंग [] [] s_HTTPStatusDescriptions' जैसे' s_HTTPStatusDescriptions [StatusCode/100] [StatusCode% 100] 'में बहुत तेज़ लुकअप है। पुनर्प्राप्त मूल्य हमेशा 'ओके' या 'फॉरबिडन' जैसे स्टेटस कोड का संक्षिप्त विवरण होता है, या कोई मिलान स्ट्रिंग नहीं मिलने पर खाली स्ट्रिंग होती है। – Triynko

-1

मैंने पहले मुझे एहसास हुआ कि यह GetAwaiter() था काम करने के लिए इस कोड को प्राप्त करने की कोशिश कर पागल हो गया था OnCompleted (...) कि समस्या थी।। यहां संस्करण है जो मैं काम कर रहा हूं:

public class ApiControllerBase : ApiController 
{ 
    ... 
    // Other code 
    ... 

    public override Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken) 
    { 
     return base 
     .ExecuteAsync(controllerContext, cancellationToken) 
     .ContinueWith(t => 
     { 
      t.Result.Headers.CacheControl = new CacheControlHeaderValue() 
      { 
       NoStore = true, 
       NoCache = true, 
       MaxAge = new TimeSpan(0), 
       MustRevalidate = true 
      }; 
      t.Result.Headers.Pragma.Add(new NameValueHeaderValue("no-cache")); 
      t.Result.Content.Headers.Expires = DateTime.Parse("01 Jan 1990 00:00:00 GMT"); 

      return t.Result; 
     }, cancellationToken); 
    } 
} 
संबंधित मुद्दे