2016-11-27 8 views
6

मुझे कुछ ऐसी सेवाएं मिली हैं जो पहले से ही एक जेसन स्ट्रिंग (ऑब्जेक्ट नहीं) प्राप्त करती हैं जिसे क्लाइंट को वापस किया जाना चाहिए। वर्तमान में, मैं स्पष्ट रूप से HttpResponseMessage बना रहा हूं और json स्ट्रिंग जो सेवा प्राप्त करता है करने के लिए अपने Content संपत्ति की स्थापना:वेब एपीआई: जेसन स्ट्रिंग को वापस करने के लिए अनुशंसित तरीका

var response = Request.CreateResponse(HttpStatusCode.OK); 
response.Content = new StringContent(jsonUtilizadores, Encoding.UTF8, "application/json"); 
return response; 

अब, वहाँ है नई IHttpActionResult साथ ऐसा करने का एक बेहतर तरीका है? Content या Ok विधि का उपयोग उद्धरण के साथ जेसन स्ट्रिंग को लपेटने के लिए समाप्त होता है, जो मैं नहीं चाहता हूं।

कोई प्रतिक्रिया?

उत्तर

8

कस्टम कार्यान्वयन बनाएँ। फ्रेमवर्क IHttpActionResult के माध्यम से एक्स्टेंसिबल है।

निम्नलिखित एक कस्टम परिणाम और विस्तार विधि ...

public static class JsonStringResultExtension { 
    public static CustomJsonStringResult JsonString(this ApiController controller, string jsonContent, HttpStatusCode statusCode = HttpStatusCode.OK) { 
     var result = new CustomJsonStringResult(controller.Request, statusCode, jsonContent); 
     return result; 
    } 

    public class CustomJsonStringResult : IHttpActionResult { 
     private string json; 
     private HttpStatusCode statusCode; 
     private HttpRequestMessage request; 

     public CustomJsonStringResult(HttpRequestMessage httpRequestMessage, HttpStatusCode statusCode = HttpStatusCode.OK, string json = "") { 
      this.request = httpRequestMessage; 
      this.json = json; 
      this.statusCode = statusCode; 
     } 

     public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) { 
      return Task.FromResult(Execute()); 
     } 

     private HttpResponseMessage Execute() { 
      var response = request.CreateResponse(statusCode); 
      response.Content = new StringContent(json, Encoding.UTF8, "application/json"); 
      return response; 
     } 
    } 
} 

... कि तब ApiController व्युत्पन्न वर्ग के लिए लागू किया जा सकता पैदा करता है। बहुत

return this.JsonString(jsonUtilizadores); //defaults to 200 OK 

करने के लिए या HTTP स्थिति कोड वांछित के साथ पिछले कॉल को सरल बनाने

return this.JsonString(jsonUtilizadores, HttpStatusCode.BadRequest); 
+1

कम से कम ठोस उत्तर मैंने अभी तक पाया है - यह नहीं पता कि यह अधिक लोकप्रिय क्यों नहीं है। धन्यवाद – Andy

4

अपने वेब एपीआई सेट JSON प्रारूप वापस जाने के लिए:

public static void Register(HttpConfiguration config) 
    { 
     config.MapHttpAttributeRoutes(); 
     // Force to ignore Request Content Type Header and reply only JSON 
     config.Formatters.Clear(); 
     config.Formatters.Add(new JsonMediaTypeFormatter()); 

     var corsAttr = new EnableCorsAttribute("*", "*", "*"); 
     config.EnableCors(corsAttr); 
    } 

और फिर वापस जाने के इस तरह प्रतिक्रिया:

 [HttpGet] 
    [Route("{taskId}/list")] 
    public IHttpActionResult GetTaskDocuments(string taskId) 
    { 
     var docs = repository.getTaskDocuments(taskId); 
     if (docs != null) 
     { 
      return Ok(docs); 
     } 
     else 
     { 
      return Ok(new ResponseStatus() { Status = Constants.RESPONSE_FAIL, Message = repository.LastErrorMsg }); 
     } 
    } 

कहाँ ResponseStatus अगली कक्षा है:

public class ResponseStatus 
    { 
     public string Status { get; set; } 
     public string Message { get; set; } 
    } 
2

आदेश बाकी अनुरूप होने के लिए में सामग्री बातचीत के जवाब प्रारूप छोड़ दो, ग्राहक तय करना चाहिए कि क्या प्रारूप यह चाहता है।

अपनी वेब एपीआई कार्रवाई में, आपको केवल Ok(your object) वापस करना चाहिए और वेब एपीआई देखेंगे कि इसे वापस करने के लिए सबसे अच्छा प्रारूप क्या है।

यदि आपको अन्य फॉर्मेटर्स को छोड़ने की आवश्यकता है, तो बस अन्य MediaTypeFormatter ऑब्जेक्ट्स को हटा दें जैसे कि एनकोसी ने सलाह दी थी।

संबंधित मुद्दे