将搜索参数(普通 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 对象,其中包含所有需要的数据。