C# 对核心API的Webclient调用可以';如果使用FromBody和FromForm参数始终为null/new,则找不到端点
以下是API代码snippit: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()) {
[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
引用创建一个属性的包装类。非常感谢。