2013-12-09 18 views
0

我們在我們的應用程序中使用了asp.net web api,因爲我們試圖返回帶有text /普通格式,但我們無法成功。同樣的事情,我們嘗試使用ASP.NET MVC它工作正常,可以請您在Web API中提供相應的解決方案。我們如何在asp.net web api中將content-type設置爲「text/plain」

請在下面找到在ASP.NET MVC

public JsonResult FileUpload(HttpPostedFileBase file) 
    { 
     string extension = System.IO.Path.GetExtension(file.FileName); 
     string bufferData = string.Empty; 

     if (file != null) 
     { 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       file.InputStream.CopyTo(ms); 
       byte[] array = ms.GetBuffer(); 
       var appendInfo = "data:image/" + extension + ";base64,"; 
       bufferData = appendInfo + Convert.ToBase64String(array); 
      } 

     } 
     var result = new 
     { 
      Data = bufferData 

     }; 

     return Json(result,"text/plain"); 
    } 

實施能否請你建議在相同的WebAPI實現的功能。

感謝, 巴格特

+0

我不認爲你可以使用Json方法返回Json作爲test/plain。 – Maess

+0

您是否試圖將該文件作爲base64編碼字符串返回?如果是這樣,爲什麼不使用FileResult呢? – Maess

回答

0

網絡API做的JSON爲你工作,這樣你就可以簡化代碼的處理在端點上。默認情況下,您需要對WebApiConfig.cs進行更改,以使所有內容都能很好地工作。我已經修改了下面的方法:

public HttpResponseMessage FileUpload(HttpPostedFileBase file) { 
    var result = new HttpResponseMessage(HttpStatusCode.NotFound); 
    var bufferData = string.Empty; 

    try 
    { 
     if (file != null) 
     { 
      var extension = System.IO.Path.GetExtension(file.FileName); 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       file.InputStream.CopyTo(ms); 
       var array = ms.GetBuffer(); 
       var appendInfo = "data:image/" + extension + ";base64,"; 
       bufferData = appendInfo + Convert.ToBase64String(array); 

       result.StatusCode = HttpStatusCode.OK; 
       // Set Headers and Content here 
       result.Content = bufferData; 
      } 

     } 
    } 
    catch(IOException ex) 
    { 
     // Handle IO Exception 
    } 

    return result 
} 

你需要在你WebApiConfig.cs做出的改變可能看起來像這樣:

public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{action}", 
       defaults: null, 
       constraints: new { action = @"\D+" } 
       ); 
// This makes the response default into JSON instead of XML 
     config.Formatters.Remove(config.Formatters.XmlFormatter); 
      } 

作爲一個說明,你可以做出非常快速修復你的代碼會這樣做,但我不建議返回字符串。

public string FileUpload(HttpPostedFileBase file) { 
    var result = new HttpResponseMessage(HttpStatusCode.NotFound); 
    var bufferData = string.Empty; 

     if (file != null) 
     { 
      var extension = System.IO.Path.GetExtension(file.FileName); 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       file.InputStream.CopyTo(ms); 
       var array = ms.GetBuffer(); 
       var appendInfo = "data:image/" + extension + ";base64,"; 
       bufferData = appendInfo + Convert.ToBase64String(array); 

       return bufferData; 
      } 

     } 
// If you get here and have not returned, 
// something went wrong and you should return an Empty 
       return String.Empty; 
} 

好運氣 - 有大量的處理文件和文件的回報方式,所以我想假設你沒有在你處理一些特殊的返回值。

0

您不需要創建自定義格式化程序來使其工作。取而代之的是返回如下內容:

[HttpGet] 
public HttpResponseMessage HelloWorld() 
{ 
    string result = "Hello world! Time is: " + DateTime.Now; 
    var resp = new HttpResponseMessage(HttpStatusCode.OK); 
    resp.Content = new StringContent(result, System.Text.Encoding.UTF8, "text/plain"); 
    return resp; 
} 

這對我而言沒有使用自定義格式化程序。

如果您明確要創建輸出並覆蓋基於Accept頭的默認內容協商,則不會希望使用Request。

CreateResponse()因爲它強制MIME類型。

而是明確創建一個新的HttpResponseMessage並手動分配內容。

上面的例子使用StringContent,但還有很多其他內容類可用於從各種.NET數據類型/結構中返回數據。

相關問題