asp.net core API中post提交,得到的结果为什么是这样?

一品梅 2020-08-06 12:32:28
namespace WebApplication1.Controllers
{
[Route("ActionApi/[controller]")]
[ApiController]

public class UserInfoController : ControllerBase
{
//检查用户名是否已注册
private ApiTools tool = new ApiTools();
[Route("CheckUserName")]
[HttpPost("{username}")]
//[HttpPost]
public HttpResponseMessage CheckUserName(string _userName)
{
int num = UserInfoGetCount(_userName);//查询是否存在该用户
if (num > 0)
{
return tool.MsgFormat(ResponseCode.操作失败, "不可注册/用户已注册", "1 " + _userName);
}
else
{
return tool.MsgFormat(ResponseCode.成功, "可注册", "0 " + _userName);
}
}

private int UserInfoGetCount(string username)
{
//return Convert.ToInt32(SearchValue("select count(id) from userinfo where username='" + username + "'"));
return username == "admin" ? 1 : 0;
}
}
}

 public class ApiTools
{
private string msgModel = "{{\"code\":{0},\"message\":\"{1}\",\"result\":{2}}}";
public ApiTools()
{
}
public HttpResponseMessage MsgFormat(ResponseCode code, string explanation, string result)
{
string r = @"^(\-|\+)?\d+(\.\d+)?$";
string json = string.Empty;
if (Regex.IsMatch(result, r) || result.ToLower() == "true" || result.ToLower() == "false" || result == "[]" || result.Contains('{'))
{
json = string.Format(msgModel, (int)code, explanation, result);
}
else
{
if (result.Contains('"'))
{
json = string.Format(msgModel, (int)code, explanation, result);
}
else
{
json = string.Format(msgModel, (int)code, explanation, "\"" + result + "\"");
}
}
return new HttpResponseMessage { Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json") };
}
}

我用postman选择POST,输入网址及入参:
http://localhost:49449/ActionApi/UserInfo/CheckUserName?username=ZHANGSAN
结果得到的结果是这个,真是太奇怪了。
{
"version": {
"major": 1,
"minor": 1,
"build": -1,
"revision": -1,
"majorRevision": -1,
"minorRevision": -1
},
"content": {
"headers": [
{
"key": "Content-Type",
"value": [
"application/json; charset=utf-8"
]
}
]
},
"statusCode": 200,
"reasonPhrase": "OK",
"headers": [],
"requestMessage": null,
"isSuccessStatusCode": true
}
...全文
4958 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
SayoKun 2020-08-07
  • 打赏
  • 举报
回复
引用 4 楼 正怒月神 的回复:
一直没有注意,然后我打开.net mvc和.net core mvc测试了一下各自的webapi。 的确楼主发现的问题是对的。 .net mvc webapi .net mvc core webapi 顺便搜了一下。 有人提供了解决方案 但是我没测试。 https://www.cnblogs.com/dudu/p/6872657.html
这个解决方案中的2楼提出了另一个解决方案,就是直接返回 Task<ContentResult>。这个我也没测,不过应该可以~
江湖评谈 2020-08-07
  • 打赏
  • 举报
回复
Mark ,不错的解决方案
一品梅 2020-08-07
  • 打赏
  • 举报
回复
谢谢各位交流很有裨益。
八爻老骥 2020-08-06
  • 打赏
  • 举报
回复
就是说HttpContent是异步加载的,而你想要得到的是同步结果,所以不能用或不能直接用HttpContent来返回结果,要么直接返回一个可序列化对象,要么如3楼所写的那样。
正怒月神 版主 2020-08-06
  • 打赏
  • 举报
回复
一直没有注意,然后我打开.net mvc和.net core mvc测试了一下各自的webapi。 的确楼主发现的问题是对的。 .net mvc webapi .net mvc core webapi 顺便搜了一下。 有人提供了解决方案 但是我没测试。 https://www.cnblogs.com/dudu/p/6872657.html
欧皇神降术 2020-08-06
  • 打赏
  • 举报
回复
HttpResponseMessage.Content.ReadAsStringAsync().Result
一品梅 2020-08-06
  • 打赏
  • 举报
回复
再深入看了下,翻到HttpContent的定义,为什么HttpContent只显示一个头文件?
public abstract class HttpContent : IDisposable
    {
        protected HttpContent();

        public HttpContentHeaders Headers { get; }

        public Task CopyToAsync(Stream stream, TransportContext context);
        public Task CopyToAsync(Stream stream);
        public void Dispose();
        public Task LoadIntoBufferAsync();
        public Task LoadIntoBufferAsync(long maxBufferSize);
        public Task<byte[]> ReadAsByteArrayAsync();
        public Task<Stream> ReadAsStreamAsync();
        public Task<string> ReadAsStringAsync();
        protected virtual Task<Stream> CreateContentReadStreamAsync();
        protected virtual void Dispose(bool disposing);
        protected abstract Task SerializeToStreamAsync(Stream stream, TransportContext context);
        protected internal abstract bool TryComputeLength(out long length);
    }
public abstract class HttpContent : IDisposable { protected HttpContent(); public HttpContentHeaders Headers { get; }//怎么只要这一个属性??? public Task CopyToAsync(Stream stream, TransportContext context); public Task CopyToAsync(Stream stream); public void Dispose(); public Task LoadIntoBufferAsync(); public Task LoadIntoBufferAsync(long maxBufferSize); public Task<byte[]> ReadAsByteArrayAsync(); public Task<Stream> ReadAsStreamAsync(); public Task<string> ReadAsStringAsync(); protected virtual Task<Stream> CreateContentReadStreamAsync(); protected virtual void Dispose(bool disposing); protected abstract Task SerializeToStreamAsync(Stream stream, TransportContext context); protected internal abstract bool TryComputeLength(out long length);
一品梅 2020-08-06
  • 打赏
  • 举报
回复
return new HttpResponseMessage { Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json") } 我转到定义看了下 public class HttpResponseMessage : IDisposable { public HttpResponseMessage(); public HttpResponseMessage(HttpStatusCode statusCode); public Version Version { get; set; } public HttpContent Content { get; set; } public HttpStatusCode StatusCode { get; set; } public string ReasonPhrase { get; set; } public HttpResponseHeaders Headers { get; } public HttpRequestMessage RequestMessage { get; set; } public bool IsSuccessStatusCode { get; } public void Dispose(); public HttpResponseMessage EnsureSuccessStatusCode(); public override string ToString(); protected virtual void Dispose(bool disposing); } 不知内容为什么没有加载上去,难道新版本HttpResponseMessage的定义变了。 我是拿网上的这个链接来学习的。不知人家的为什么可以调试出那个结果。源代码和结果链接如下, 兄弟们可以调试一下看看,找到原因的请留个言,十分感谢。 (9条消息)C# 搭建一个简单的WebApi项目_lwpoor123的博客-CSDN博客 https://blog.csdn.net/lwpoor123/article/details/78285148

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧