我们在我们的应用程序中使用asp.net web api,因为我们尝试使用text / plain格式返回内容类型的响应,但我们无法成功。我们尝试使用ASP.NET MVC也一样,它可以正常工作,请您在Web API中为我提供等效的解决方案。
请在下面找到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 :(得分:0)
Web 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;
}
祝你好运 - 有很多方法可以处理文件和文件退货,所以我想假设你在处理时没有特别的回报价值。
答案 1 :(得分: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标头的默认内容协商,那么您将不想使用请求。
CreateResponse()
因为它会强制使用mime类型。
而是显式创建新的HttpResponseMessage
并手动分配内容。
上面的示例使用StringContent
但是还有很多其他内容类可用于从各种.NET数据类型/结构返回数据。