GVKun编程网logo

c# – ASP.NET核心API控制器:Response.Body.WriteAsync base64字符串不起作用

10

本文将带您了解关于c#–ASP.NET核心API控制器:Response.Body.WriteAsyncbase64字符串不起作用的新内容,另外,我们还将为您提供关于@ResponseBodyasth

本文将带您了解关于c# – ASP.NET核心API控制器:Response.Body.WriteAsync base64字符串不起作用的新内容,另外,我们还将为您提供关于@ResponseBody as the response has already been committed.、@ResponseBody与response.getWriter .write()区别、ASP .Net 'Get' Web API 控制器 url 的输入参数具有 # 特殊字符不起作用、asp base64 utf-8为了兼容asp.net的base64的实用信息。

本文目录一览:

c# – ASP.NET核心API控制器:Response.Body.WriteAsync base64字符串不起作用

c# – ASP.NET核心API控制器:Response.Body.WriteAsync base64字符串不起作用

我正在尝试从API控制器返回表示jpeg图像的base64字符串,并将其设置为< img>的src.但我所有的尝试都失败了.

这是非常简单的HTML:

<img src="/api/TestBase64Image" alt="image test" />

而我的控制器:

[Route("api/[controller]")]
public class TestBase64ImageController : Controller
{
    private const string _base64Image = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEBLAEsAAD/7Sfg.....";
    private const string _base64Image2 = "/9j/4AAQSkZJRgABAQEBLAEsAAD/7Sfg.....

    [HttpGet]
    public async Task Get()
    {
        Response.ContentType = "image/jpeg";
        //Response.ContentType = "text/plain";
        //Response.ContentType = new MediaTypeHeaderValue("image/jpeg").ToString();
        //Response.ContentType = new MediaTypeHeaderValue("text/plain").ToString();

        //Response.Headers.Add("Content-Length",_base64Image.Length.ToString());
        //HttpContext.Response.ContentLength = _base64Image.Length;

        await Response.Body.WriteAsync(Encoding.UTF8.GetBytes(_base64Image),_base64Image.Length);
        //await Response.Body.FlushAsync();
    }
}

我已经尝试过几个方面,比如删除FlushAsync(),改变定义ContentType的方式,包括数据:image / jpeg; base64,在字符串中或不是,但没有任何工作.

我已经看到在here和here中,在Response体流中写入是可行的,所以我认为我的方法很好(我之前尝试过返回一个简单的字符串但不能正常工作).

是的,我的base64字符串是正确的,因为我还试图将它直接包含在HTML中,图像显示正确.

我确切地说我不想使用任何JavaScript或Razor视图来实现这一点,只有纯HTML和我的控制器.

另请注意我在API控制器中.我不能像我们在一个空的ASP.NET核心项目的Startup类中的Configure方法中看到的那样做:

app.Run(async (context) =>
{
    await context.Response.WriteAsync("Hello World!");
});

即使两个响应的类型都是HttpResponse,我的控制器中的那个也没有任何Response.WriteAsync但是Response.Body.WriteAsync

感谢您的帮助,我正在搜索几个小时,但对于ASP.NET Core几乎没有相关的资源

解决方法

您仍然将数据作为base64文本返回,基本上 – 您将获得UTF-8编码形式,但这就是全部.

如果你真的只有图像的base64版本,你只需要解码:

byte[] image = Convert.FromBase64String(_base64Image2);
await Response.Body.WriteAsync(image,image.Length);

(请注意,它只需要您转换的base64 – 而不是数据URI.)

@ResponseBody as the response has already been committed.

@ResponseBody as the response has already been committed.

这种情况是 页面跳转 增加了 @ResponseBody 2017-02-16 19:08:09.131 DEBUG [catalina-exec-8][FilterChainProxy.java:200] - /WEB-INF/jsp/page/newsList.jsp has no matching filters 2017-02-16 19:08:09.132 DEBUG [catalina-exec-8][RequestContextFilter.java:104] - Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@64327ce7 2017-02-16 19:08:09.132 ERROR [catalina-exec-8][ErrorPageFilter.java:204] - Cannot forward to error page for request [/newsList] as the response has already been committed. As a result, the response may have the wrong status code. If your application is running on WebSphere Application Server you may be able to resolve this problem by setting com.ibm.ws.webcontainer.invokeFlushAfterService to false

这种情况是页面不存在 2017-02-16 19:14:13.561 ERROR [catalina-exec-2][ErrorPageFilter.java:204] - Cannot forward to error page for request [/newsList] as the response has already been committed. As a result, the response may have the wrong status code. If your application is running on WebSphere Application Server you may be able to resolve this problem by setting com.ibm.ws.webcontainer.invokeFlushAfterService to false

    @ResponseBody
    @RequestMapping("/newsList")
    public ModelAndView newsList()
        throws Exception
    {
        LiveNewsInfo newsInfo = new LiveNewsInfo();
       List<LiveNewsInfo> newsList = liveNewsInfoMapper.selectLiveNewsInfoList(newsInfo);
//        newsInfo.setPageNum(pageNum);
//        newsInfo.setPageCount(10);
//      // 页面位置 /WEB-INF/jsp/page/page1.jsp
        ModelAndView mav = new ModelAndView("page/newsList");
        mav.addObject("newsList", newsList);
        return mav;
    }
    
    /**
     * 响应到JSP页面page1
     *
     * @return
     * @author SHANHY
     * @create 2016年1月5日
     */
    @RequestMapping("/page1")
    public ModelAndView page1()
    {
        // 页面位置 /WEB-INF/jsp/page/page1.jsp
        ModelAndView mav = new ModelAndView("page/page1");
        mav.addObject("content", hello);
        return mav;
    }

@ResponseBody与response.getWriter .write()区别

@ResponseBody与response.getWriter .write()区别

@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML

  数据,需要注意的呢,在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。

2、  

  @RequestMapping("/login")
  @ResponseBody
  public User login(User user){
    return user;
  }
  User字段:userName pwd
  那么在前台接收到的数据为:''{"userName":"xxx","pwd":"xxx"}''

  效果等同于如下代码:(由此看出,使用 ResponseBody则比较省事些)
  @RequestMapping("/login")
  public void login(User user, HttpServletResponse response){
    response.getWriter.write(JSONObject.fromObject(user).toString());
  }

 

 

===========================

 

理解:很多情况我们需要在controller接收请求然后返回一些message。

在springmvc中当返回值是String时,如果不加@ResponseBody的话,返回的字符串就会找这个String对应的页面,如果找不到会报404错误。 
如果加上@ResponseBody注解的话,返回的就是json字符串,并且把这个json字符串返回给发送请求的原页面。

当然也有时候不加@ResponseBody注解,那么就需要我们在controller的方法中传入response参数,然后在方法里面获取response.getWriter()赋给PrintWriter。然后通过PrintWriter把这个字符串以流的形式传递给原发送请求的页面

 

应用场景:页面或者js异步请求Controller,Controller不需要返回view,而只需要返回数据时,就可以使用@ResponseBody注解。@ResponseBody注解会把return 的结果放到response对象中。

只要在页面或者js中ajax指定dataType,并且在Controller上使用@ResponseBody注解来修饰,SpringMVC就会帮我们把这个Controller返回的对象转为json格式的。

若想返回一段小的字符串到页面上,可以在Controller中使用PrintWriter类,直接 out.print(字符串),此时这个java方法不需要使用@ResponseBody注解修饰,若想用@ResponseBody注解修饰,只需要在ajax中指定dataType为text。

ASP .Net 'Get' Web API 控制器 url 的输入参数具有 # 特殊字符不起作用

ASP .Net 'Get' Web API 控制器 url 的输入参数具有 # 特殊字符不起作用

如何解决ASP .Net ''Get'' Web API 控制器 url 的输入参数具有 # 特殊字符不起作用?

Get Controller 接受 userName 和 Pwd 参数。 如果密码有 # 特殊字符,则它不起作用,但它适用于其他特殊字符(!$@..)。 在邮递员中,# 替换为 %23。

网址:https://localhost:8003/api/EmpInfoTest?userName=Afzal&userPwd=Afzal#123

public  class EmpInfoTestController : ApiController
    {
 public string Get(string userName,string userPwd)
        {

     //line1
     //line2
     //return
}
}

Internet 上使用 Server.UrlEncode(url) 的解决方案。

告诉我如何以及在何处使用 urlEncode。

谢谢, 阿夫扎尔。

解决方法

浏览器不会传递 # 字符。

经过测试,向服务器发送请求,发现后端方法中没有#参数及以下字符。

所以结论是发送请求时应该处理urlencode。

我的示例代码(我使用 ajax):

enter image description here

enter image description here

我的测试结果:

enter image description here

asp base64 utf-8为了兼容asp.net的base64

asp base64 utf-8为了兼容asp.net的base64

复制代码 代码如下:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%Session.CodePage=65001%>
<!--#include file="base64.asp"-->
<%
Function AspUrlDecode(strValue)
Dim varAry, varElement, objStream, lngLoop, Flag
strValue = Replace(strValue, "+", " ")
varAry = Split(strValue, "%")
Flag = varAry(0) = ""
Set objStream = Server.CreateObject("ADODB.Stream")
With objStream
.Type = 2
.Mode = 3
.Open
For Each varElement In varAry
If varElement <> Empty Then
If Len(varElement) >= 2 And Flag Then
.WriteText ChrB(CInt("&H" & Left(varElement, 2)))
For lngLoop = 3 To Len(varElement)
.WriteText ChrB(Asc(Mid(varElement, lngLoop, 1)))
Next
Else
For lngLoop = 1 To Len(varElement)
.WriteText ChrB(Asc(Mid(varElement, lngLoop, 1)))
Next
Flag = True
End If
End If
Next
.WriteText Chr(0)
.Position = 0
AspUrlDecode = Replace(ConvUnicode(.ReadText), Chr(0), "", 1, -1, 0)
On Error Resume Next
.Close
Set objStream = Nothing
End With
End Function



Function ConvUnicode(ByVal strData)
Dim rs, stm, bytAry, intLen
If Len(strData & "") > 0 Then
strData = MidB(strData, 1)
intLen = LenB(strData)
Set rs = Server.CreateObject("ADODB.Recordset")
Set stm = Server.CreateObject("ADODB.Stream")
With rs
.Fields.Append "X", 205, intLen
.Open
.AddNew
rs(0).AppendChunk strData & ChrB(0)
.Update
bytAry = rs(0).GetChunk(intLen)
End With
With stm
.Type = 1
.Open
.Write bytAry
.Position = 0
.Type = 2
.Charset = "utf-8"
ConvUnicode = .ReadText
End With
End If
On Error Resume Next
stm.Close
Set stm = Nothing
rs.Close
Set rs = Nothing
End Function


%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<%


''base64编码后,比起.net多了77u/
Response.Write("base64编码后:"&base64Encode("阿会楠")&"<br />")

''base64解码后
Response.Write("base64解码后:"&base64uncode("6Zi/5Lya5qWg")&"<br />")

%>
</body>
</html>

我们今天的关于c# – ASP.NET核心API控制器:Response.Body.WriteAsync base64字符串不起作用的分享就到这里,谢谢您的阅读,如果想了解更多关于@ResponseBody as the response has already been committed.、@ResponseBody与response.getWriter .write()区别、ASP .Net 'Get' Web API 控制器 url 的输入参数具有 # 特殊字符不起作用、asp base64 utf-8为了兼容asp.net的base64的相关信息,可以在本站进行搜索。

本文标签:

上一篇是否有充分的理由在#region中包装单个属性?

下一篇java 常用工具类(从开源项目 smartframework 项目 copy 过来备用)(java开发中常用的工具类)