将搜索参数(普通 text/json)从 MVC 网络客户端 (HttpWebResponse) 传递到 Web Api
Pass search parameters (plain text/json) from MVC web client (HttpWebResponse) to Web Api
今天我问你是因为我很难找到解决这个具体问题的合适方法。
我有一个 MVC 客户端应用程序,它通过 HttpWebResponse 与 Web Api 进行通信,旨在检索数据并对结果进行操作。
由于所有请求都是在部分视图中处理的,因此我通过 AJAX 调用所有相关的 functions/methods。
像这样:
$('#dosearch').click(function () {
var searchstring = "{ ";
$('#tab_' + $("ul#tabs_searchmask_header li.active").attr('id')).find('input:text').each(function () {
var el = $(this);
if (el.val() !== "") {
searchstring += "\"" + el.attr('id') + "\": [ \"" + el.val() + "\" ], ";
}
});
searchstring += "}";
searchstring = searchstring.replace(" ], }", "] }");
$.ajax({
url: '@Url.Action("GetResults", "SearchResult", null, Request.Url?.Scheme)',
type: 'POST',
data: { filecabinet: '@Model.FileCabinet', search: searchstring }
}).done(function (partialViewResult) {
$("#_pviewcontent").html(partialViewResult);
});
});
这将创建一个简单的 json 字符串,其中包含我需要的所有相关数据。由于查询大小最多只能容纳 2000 个字符,因此我必须在此处使用 'POST' 来扩展可以传递的 data/search 参数的数量。
最终这会调用控制器,获取一些额外的数据并将其传递给与 Web Api 控制器通信的包装器。
var request = (HttpWebRequest)WebRequest.Create(new Uri(url));
request.Credentials = CredentialCache.DefaultNetworkCredentials;
request.Method = method;
WebRequest.DefaultWebProxy = null;
request.Proxy = WebRequest.DefaultWebProxy;
if (method == WebRequestMethods.Http.Post)
{
data = "=" + data;
var bytes = new byte[data.Length * sizeof(char)];
Buffer.BlockCopy(data.ToCharArray(), 0, bytes, 0, bytes.Length);
request.ContentLength = bytes.Length;
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
request.Expect = "application/x-www-form-urlencoded; charset=UTF-8";
request.GetRequestStream().Write(bytes, 0, bytes.Length);
}
return request.GetResponse() as HttpWebResponse;
我尝试将内容类型更改为 "application/json",但结果是参数为空值。
这是我的 Web Api 方法,它应该接收参数并将它们保存在 searchparams.
中
[HttpPost]
public ResultListModel GetResults(string sessionID, string filecabinet, [FromBody]string searchparams)
{
....
}
我得到的只是一个字符串化的字节数组。我想知道是否有另一种方法可以按原样传递数据:纯文本(或至少 json 对象)。
有什么想法或建议吗?
亲切的问候
通过简单地改变
解决了这个谜题
if (method == WebRequestMethods.Http.Post)
{
data = "=" + data;
var bytes = new byte[data.Length * sizeof(char)];
Buffer.BlockCopy(data.ToCharArray(), 0, bytes, 0, bytes.Length);
request.ContentLength = bytes.Length;
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
request.Expect = "application/x-www-form-urlencoded; charset=UTF-8";
request.GetRequestStream().Write(bytes, 0, bytes.Length);
}
到
if (method == WebRequestMethods.Http.Post)
{
request.ContentType = "application/json";
request.Accept = "application/json";
request.Method = "POST";
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
streamWriter.Write(JObject.Parse(data));
streamWriter.Flush();
}
}
和
[HttpPost]
public ResultListModel GetResults(string sessionID, string filecabinet, [FromBody]string searchparams)
{
....
}
到
[HttpPost]
public ResultListModel GetResults(string sessionID, string filecabinet, [FromBody]JObject searchparams)
{
....
}
现在我的 Web Api 控制器收到一个 json 对象,其中包含所有需要的数据。
今天我问你是因为我很难找到解决这个具体问题的合适方法。
我有一个 MVC 客户端应用程序,它通过 HttpWebResponse 与 Web Api 进行通信,旨在检索数据并对结果进行操作。
由于所有请求都是在部分视图中处理的,因此我通过 AJAX 调用所有相关的 functions/methods。
像这样:
$('#dosearch').click(function () {
var searchstring = "{ ";
$('#tab_' + $("ul#tabs_searchmask_header li.active").attr('id')).find('input:text').each(function () {
var el = $(this);
if (el.val() !== "") {
searchstring += "\"" + el.attr('id') + "\": [ \"" + el.val() + "\" ], ";
}
});
searchstring += "}";
searchstring = searchstring.replace(" ], }", "] }");
$.ajax({
url: '@Url.Action("GetResults", "SearchResult", null, Request.Url?.Scheme)',
type: 'POST',
data: { filecabinet: '@Model.FileCabinet', search: searchstring }
}).done(function (partialViewResult) {
$("#_pviewcontent").html(partialViewResult);
});
});
这将创建一个简单的 json 字符串,其中包含我需要的所有相关数据。由于查询大小最多只能容纳 2000 个字符,因此我必须在此处使用 'POST' 来扩展可以传递的 data/search 参数的数量。
最终这会调用控制器,获取一些额外的数据并将其传递给与 Web Api 控制器通信的包装器。
var request = (HttpWebRequest)WebRequest.Create(new Uri(url));
request.Credentials = CredentialCache.DefaultNetworkCredentials;
request.Method = method;
WebRequest.DefaultWebProxy = null;
request.Proxy = WebRequest.DefaultWebProxy;
if (method == WebRequestMethods.Http.Post)
{
data = "=" + data;
var bytes = new byte[data.Length * sizeof(char)];
Buffer.BlockCopy(data.ToCharArray(), 0, bytes, 0, bytes.Length);
request.ContentLength = bytes.Length;
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
request.Expect = "application/x-www-form-urlencoded; charset=UTF-8";
request.GetRequestStream().Write(bytes, 0, bytes.Length);
}
return request.GetResponse() as HttpWebResponse;
我尝试将内容类型更改为 "application/json",但结果是参数为空值。
这是我的 Web Api 方法,它应该接收参数并将它们保存在 searchparams.
中[HttpPost]
public ResultListModel GetResults(string sessionID, string filecabinet, [FromBody]string searchparams)
{
....
}
我得到的只是一个字符串化的字节数组。我想知道是否有另一种方法可以按原样传递数据:纯文本(或至少 json 对象)。
有什么想法或建议吗?
亲切的问候
通过简单地改变
解决了这个谜题if (method == WebRequestMethods.Http.Post)
{
data = "=" + data;
var bytes = new byte[data.Length * sizeof(char)];
Buffer.BlockCopy(data.ToCharArray(), 0, bytes, 0, bytes.Length);
request.ContentLength = bytes.Length;
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
request.Expect = "application/x-www-form-urlencoded; charset=UTF-8";
request.GetRequestStream().Write(bytes, 0, bytes.Length);
}
到
if (method == WebRequestMethods.Http.Post)
{
request.ContentType = "application/json";
request.Accept = "application/json";
request.Method = "POST";
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
streamWriter.Write(JObject.Parse(data));
streamWriter.Flush();
}
}
和
[HttpPost]
public ResultListModel GetResults(string sessionID, string filecabinet, [FromBody]string searchparams)
{
....
}
到
[HttpPost]
public ResultListModel GetResults(string sessionID, string filecabinet, [FromBody]JObject searchparams)
{
....
}
现在我的 Web Api 控制器收到一个 json 对象,其中包含所有需要的数据。