Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法从AngularJS将简单字符串数据发布到Web API_C#_Angularjs_Web Services_Http Post_Asp.net Web Api - Fatal编程技术网

C# 无法从AngularJS将简单字符串数据发布到Web API

C# 无法从AngularJS将简单字符串数据发布到Web API,c#,angularjs,web-services,http-post,asp.net-web-api,C#,Angularjs,Web Services,Http Post,Asp.net Web Api,我正在尝试从我的angular应用程序获取一个json字符串到一个Web API。在过去的6个小时里,我浏览了整个互联网,试图找出我做错了什么,但不幸失败了 我已经检查了网络控制台,可以看到json作为表单数据,但是出于某种原因,我的WEB api没有得到它。我看过其他几篇文章,但没有一篇对我的问题有帮助。任何方向都很好。我已经尝试过使用“transform”修复程序,但没有效果 WEB API的入口点 [HttpPost] [Route("api/SkeltaInterfaceControll

我正在尝试从我的angular应用程序获取一个json字符串到一个Web API。在过去的6个小时里,我浏览了整个互联网,试图找出我做错了什么,但不幸失败了

我已经检查了网络控制台,可以看到json作为表单数据,但是出于某种原因,我的WEB api没有得到它。我看过其他几篇文章,但没有一篇对我的问题有帮助。任何方向都很好。我已经尝试过使用“transform”修复程序,但没有效果

WEB API的入口点

[HttpPost]
[Route("api/SkeltaInterfaceController/SaveWorkflow")]
public bool SaveWorkflow([FromBody] string json)
{
    ...
}
角度呼叫

$scope.SaveWorkFlow = function () {
    $http({
        headers: {'Content-Type': 'application/x-www-form-urlencoded'},
        method: "POST",
        url: webAPI,
        data: {'DATA' : 'TEST DATA'
        }
    })
}
EDIT:I更改了对此的角度调用

$scope.SaveWorkFlow = function () {
    $http({
        headers: {'Content-Type': 'application/x-www-form-urlencoded'},
        method: "POST",
        url: webAPI,
        data: {'DATA' : 'TEST DATA'}
    })
}
Web API如下所示

[HttpPost]
[Route("api/SkeltaInterfaceController/SaveWorkflow")]
public bool SaveWorkflow([FromBody] TestModel json)
{
    ...
}
模型呢

public class TestModel
{
    public string DATA { get; set; }
}

但是,我仍然得到一个空值,这是我设置的错误吗?

我认为您的问题归结为希望接收字符串的WebApi控制器方法,但您正在向它传递一个对象。它是否至少命中了该方法,但接收空值

这取决于您试图发送给WebApi控制器方法的内容,但如果您打算发送对象,则应在WebApi项目中创建表示该对象的模型,并使该方法将对象作为参数

例如,您现在使用的方式是:

public class SaveModel 
{
    public string DATA {get; set;}
}


[HttpPost]
[Route("api/SkeltaInterfaceController/SaveWorkflow")]
public bool SaveWorkflow([FromBody] SaveModel model)
{ ...

虽然您已经找到了一个解决方案,但仍有一些方法可以
简单的
数据(非对象)发布到
Web API
服务

假设您有这样一个POST API(在Test ApiController中)

AngularJS
你可以像

(1)数据为
JSON
(默认)

默认情况下,这将使用
内容类型:application/json
。服务器将把数据作为JSON处理。如果查看请求,您将看到请求主体是一个简单的字符串,如

"test"
对于复杂对象,您会看到它们是JSON格式的

(2)数据为
应用程序/x-www-form-urlencoded
(如您的示例所示)

这里,我们显式地将内容类型指定为
application/x-www-form-urlencoded
,因此我们必须以该格式发送数据(很像url查询字符串)。在这里,数据中的空键只是为了满足
webapi
奇怪的模型绑定需求!结果数据的编码如下所示

=test
我们已经用
$.param({“”:“test”})
完成了。原因之一是,
FromBody
主要用于发送
对象
,而不是简单的原语值


因此,代码的基本问题是,您指定了内容类型:application/x-www-form-urlencoded,并将数据作为JSON发送

你能导入请求.输入流吗?如果可以,请提供完整的.NET类。您使用什么后端框架?Angular的版本是什么?回答你的问题,是的。它正在命中该方法,但接收到空值。这听起来像我描述的问题。由于在$http请求中传递一个带有单个字符串参数“DATA”的对象,因此WebApi方法接收并反序列化该对象。但是,由于它只需要一个字符串,并且收到了一些完全不同的对象,因此它认为请求无效,并为该参数提供null。如果您试图传递给WebApi方法的只是一个字符串,那么您应该能够将其作为数据而不是带有字符串参数的JSON对象传递。请检查我的编辑。我不是做错了什么,就是有更深层次的问题。你能试着把内容类型改成“application/json”吗?我正要对此发表评论。我将类型更改为application/json,它可以完美地工作。我不想创建一个模型,但如果这是我必须要做的,那没关系。为我指明了正确的方向。我发现的每个示例都不断告诉我使用“application/x-www-form-urlencoded”,因此这应该有助于您理解为什么它会出现在那里。仅供参考:$.param从未对我起作用。我试过了。我不知道问题出在哪里。@Willy the
$.param({“”:“YourStringValue”})
工作正常,只要(1)键是空的,(2)内容类型是
application/x-www-form-urlencoded
。如果不起作用,请检查发送到服务器和/或开发人员控制台的请求是否存在其他错误。
"test"
$scope.Test = function () {
    $http({
        headers: {'Content-Type': 'application/x-www-form-urlencoded'},
        method: "POST",
        url: "/api/Test",
        data: $.param({ "": "test" }),
    });
};
=test