Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.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# 对核心API的Webclient调用可以';如果使用FromBody和FromForm参数始终为null/new,则找不到端点_C#_Asp.net Core_Webclient - Fatal编程技术网

C# 对核心API的Webclient调用可以';如果使用FromBody和FromForm参数始终为null/new,则找不到端点

C# 对核心API的Webclient调用可以';如果使用FromBody和FromForm参数始终为null/new,则找不到端点,c#,asp.net-core,webclient,C#,Asp.net Core,Webclient,以下是API代码snippit: [HttpPost] [ProducesResponseType(typeof(myObject), 201)] //created [ProducesResponseType(500)] //server error public IActionResult Create([FromForm]myObject myObj) { ... 以下是服务器端调用: ... using (WebClient client = new WebClient()) {

以下是API代码snippit:

[HttpPost]
[ProducesResponseType(typeof(myObject), 201)] //created
[ProducesResponseType(500)] //server error
public IActionResult Create([FromForm]myObject myObj) {
...
以下是服务器端调用:

...
using (WebClient client = new WebClient()) {        
    NameValueCollection formData = new NameValueCollection();
    string targetURL = "https://localhost:44317/api/MyController/Create"
    string callMethod = "POST";
    formData["myObj"] = JsonConvert.SerializeObject(myObj);
    var thingy = client.UploadValues(targetURL, callMethod, formData);
    ...
如果我使用
[FromForm]
,调用会找到端点,但传入的数据就像我说的
myObj=newmyobject()具有所有内容的默认值。所以不完全是空的

如果我使用
[FromBody]
客户端
找不到url,我会收到一个
400错误请求

我在这里和其他地方读过很多帖子,我认为它们并没有完全涵盖这种情况,因为我所观察到的似乎与其他人所问的相反。所以我不确定我的代码到底是怎么回事


注意,我不能使用async,所以我不能使用HttpClient。(无法使用async,因为它位于Kentico网站内,而这是门户页面内的ascx)

您使用
FromForm
的问题是将其序列化为字符串,默认情况下,WebAPI不会为您的用户反序列化它。如果要继续使用
FromForm
,可以将参数类型更改为string并显式反序列化:

public IActionResult Create([FromForm]string myObj) {
    myObject obj = JsonConvert.DeserializeObject<myObject>(myObj);
    ...
public IActionResult Create([FromForm]字符串myObj){
myObjectObj=JsonConvert.DeserializeObject(myObj);
...

您似乎打算发布JSON,但实际上您发布的是
x-www-form-urlencoded
,其中序列化的JSON作为
myObj
参数的值。由于编码类型,操作必须使用
[FromForm]
(或者根本没有属性),但此时,它无法反序列化您的“JSON”我在这里使用引号中的“JSON”,因为实际上它只是一个字符串。ASP.NET Core根本不知道这是JSON,也不知道它应该对它做些什么。长短不一,您需要使用实际的
应用程序/JSON
请求正文发布

using (var client = new WebClient())
{
    client.Headers["Content-Type"] = "application/json; charset=utf-8";
    var requestBody = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(myObj));
    var response = webClient.UploadData(targetUrl, callMethod, requestBody);
}

然后,当然,您需要在您的参数上实际使用
FromBody
属性,因为现在您实际上将接收JSON。

不,
string myObj
遇到时为空。刚刚尝试过。问题:如果API Method签名中有两个参数,我将如何执行此操作。比如说一个字符串和一个myObj?您不能有multiple操作参数来自请求正文。除了标记为
[FromBody]
的参数外,您可能还有其他参数,但前提是这些参数是从URL获得的。例如,您可以使用
/Foo/{id}这样的路由执行
MyAction(int-id,[FromBody]Foo-Foo)
。否则,所有发布的信息都必须放在您绑定到的类中。如果您需要无法保存在
MyObject
类中的其他数据,那么您需要为这些附加数据创建一个具有属性的包装类,并为您的
MyObject
引用创建一个属性的包装类。非常感谢。