Web API post 参数
Web API post parameter
我目前有一个 webapi 调用的问题。我想用我的 ApiController 下载并打开一个日志文件。
我使用 javascript 函数为我的控制器 post 一个文件名。
这是 post 参数的辅助函数(来自 dystroy 的回答):
How to replace window.open(...) with a POST
现在当我在我的控制器中使用一个简单的字符串作为参数时,我无法获取参数,它总是空的。
public HttpResponseMessage PostDownloadLogFile([FromBody]string psFileName)
{
//psFileName is always null
但是,如果我使用 HttpReqeustMessage
作为参数并从我的请求中读取表单数据,则没有问题并且可以正常工作。
public HttpResponseMessage PostDownloadLogFile(HttpRequestMessage poRequest)
{
var loFormData = poRequest.Content.ReadAsFormDataAsync().Result;
string psFileName = loFormData["psFileName"]; //psFileName is set correct
有没有在我的控制器中使用简单参数获取参数的解决方案?
更新
这是我的 javascript 辅助函数:
var loOpenWindow = function (psMethode, psUrl, poData, psTarget) {
var loForm = document.createElement("form");
loForm.action = psUrl;
loForm.method = psMethode;
loForm.target = psTarget || "_self";
if (poData) {
for (var lsKey in poData) {
var loInput = document.createElement("textarea");
loInput.name = lsKey;
loInput.value = typeof poData[lsKey] === "object" ? JSON.stringify(poData[lsKey]) : poData[lsKey];
loForm.appendChild(loInput);
}
}
loForm.style.display = "none";
document.body.appendChild(loForm);
loForm.submit();
};
称呼它:
helper.openWindow("POST", apiRoutes.URLS.ApiPostDownloadLogFile, { "psFilename": $scope.data.showLogEntry.FullName });
客户端代码应该没有问题,因为使用 HttpReqeustMessage
的控制器方法可以正常工作。
这是浏览器请求:
可能问题出在您发送数据的客户端代码中。
[FromBody]
parameters must be encoded as =value
那么,这行不通:
// Value will be null.
$.post('api/values', value);
// Value will be null.
$.post('api/values', { key: value });
但是这项工作:
$.post('api/values', "=" + value);
尝试更改您的客户端代码以仅在正文中发送 =/path/to/your/file
。
参考:http://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/
好的,我找到了解决方案。
如果我使用 class
作为参数并使用给定名称的 属性,它似乎可以工作。
public class Param
{
public string psFileName { get; set; }
}
和
public HttpResponseMessage PostDownloadLogFile(Param poParam)
{
string psFileName = poParam.psFileName; //psFileName is set correct
这并不是一个简单的参数,但我可以接受这个解决方案。
我目前有一个 webapi 调用的问题。我想用我的 ApiController 下载并打开一个日志文件。 我使用 javascript 函数为我的控制器 post 一个文件名。
这是 post 参数的辅助函数(来自 dystroy 的回答): How to replace window.open(...) with a POST
现在当我在我的控制器中使用一个简单的字符串作为参数时,我无法获取参数,它总是空的。
public HttpResponseMessage PostDownloadLogFile([FromBody]string psFileName)
{
//psFileName is always null
但是,如果我使用 HttpReqeustMessage
作为参数并从我的请求中读取表单数据,则没有问题并且可以正常工作。
public HttpResponseMessage PostDownloadLogFile(HttpRequestMessage poRequest)
{
var loFormData = poRequest.Content.ReadAsFormDataAsync().Result;
string psFileName = loFormData["psFileName"]; //psFileName is set correct
有没有在我的控制器中使用简单参数获取参数的解决方案?
更新
这是我的 javascript 辅助函数:
var loOpenWindow = function (psMethode, psUrl, poData, psTarget) {
var loForm = document.createElement("form");
loForm.action = psUrl;
loForm.method = psMethode;
loForm.target = psTarget || "_self";
if (poData) {
for (var lsKey in poData) {
var loInput = document.createElement("textarea");
loInput.name = lsKey;
loInput.value = typeof poData[lsKey] === "object" ? JSON.stringify(poData[lsKey]) : poData[lsKey];
loForm.appendChild(loInput);
}
}
loForm.style.display = "none";
document.body.appendChild(loForm);
loForm.submit();
};
称呼它:
helper.openWindow("POST", apiRoutes.URLS.ApiPostDownloadLogFile, { "psFilename": $scope.data.showLogEntry.FullName });
客户端代码应该没有问题,因为使用 HttpReqeustMessage
的控制器方法可以正常工作。
这是浏览器请求:
可能问题出在您发送数据的客户端代码中。
[FromBody]
parameters must be encoded as=value
那么,这行不通:
// Value will be null.
$.post('api/values', value);
// Value will be null.
$.post('api/values', { key: value });
但是这项工作:
$.post('api/values', "=" + value);
尝试更改您的客户端代码以仅在正文中发送 =/path/to/your/file
。
参考:http://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/
好的,我找到了解决方案。
如果我使用 class
作为参数并使用给定名称的 属性,它似乎可以工作。
public class Param
{
public string psFileName { get; set; }
}
和
public HttpResponseMessage PostDownloadLogFile(Param poParam)
{
string psFileName = poParam.psFileName; //psFileName is set correct
这并不是一个简单的参数,但我可以接受这个解决方案。