如何通过POST向WebApi发送原始数据?MVC调用报错求助
问题分析与解决方案
你遇到的这个指定值没有':'分隔符。参数名: header错误,根源确实就在你怀疑的那行代码:request.Headers.Add(postData);。
错误原因
WebRequest.Headers.Add()方法要求传入的是键值对格式的头部信息(比如"Key: Value"),但你直接把pToken这个原始字符串传进去了——它没有:分隔符,自然会触发异常。更关键的是,Postman里能成功的请求,应该是把token放到请求体里,而非请求头中,你完全搞错了数据传递的位置。
修正后的代码
下面是调整后的完整代码,我把token移到了请求流中,同时保留了正确的ApiKey请求头逻辑:
public UserCustom GetUserByToken(string pToken) { ResponseLogin vRespuesta = new ResponseLogin(); UserCarmocal vUsuarioFinal = null; string vApiKey = ConfigurationManager.AppSettings["ApiKey"]; string vDirUser = ConfigurationManager.AppSettings["EndpointUsr"]; WebRequest request = WebRequest.Create(vDirUser); request.Method = "POST"; request.ContentType = "application/json; charset=utf-8"; request.Headers.Add("ApiKey", vApiKey); // 将token作为请求体发送,而非添加到请求头 string postData = pToken; byte[] byteArray = Encoding.UTF8.GetBytes(postData); request.ContentLength = byteArray.Length; // 写入请求体数据到流中 using (Stream dataStream = request.GetRequestStream()) { dataStream.Write(byteArray, 0, byteArray.Length); } using (Stream s = request.GetResponse().GetResponseStream()) { using (StreamReader sr = new StreamReader(s)) { vRespuesta = new JavaScriptSerializer().Deserialize<ResponseLogin>(sr.ReadToEnd()); if (vRespuesta.status == "success") { vUsuarioFinal = new UserCarmocal(); // 初始化对象,避免空引用异常 vUsuarioFinal.FirstName = "Test"; } } } return vUsuarioFinal; }
额外注意事项
- 我补充了
vUsuarioFinal = new UserCarmocal();这行代码,否则当status不为success时,返回的空对象若被后续代码调用属性,会触发空引用异常。 - 如果你在Postman中是把token放到特定的JSON字段里(比如
{"token": "你的令牌内容"}),那需要把postData改成对应的格式,比如string postData = $"{{\"token\": \"{pToken}\"}}";,确保和Postman的请求体完全一致。
内容的提问来源于stack exchange,提问作者Fryla- Cristian Marucci
相关产品推荐
相关产品推荐

