MVC Api 控制器序列化参数

MVC Api Controller Serielized parameters

我正在做一个 MVC 5 应用程序,我正在调用另一个解决方案中的 API 控制器方法。

我正在使用 HttpClient()。我用一些参数调用 PostAsJsonAsync,class 的一个实例。

看起来像这样。

string apiUrl = "localhost:8080/api/";
ContactWF contactWF = new contactWF();
contactWF.contact_id=0;
contactWF.UserOrigin_id=20006
contactWF.ProcessState_id=2;

using (HttpClient client = new HttpClient())
{
    client.BaseAddress = new Uri(apiUrl);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
    HttpResponseMessage response = await client.PostAsJsonAsync(apiUrl + "Contact/Method", contactWF);
    if (response.IsSuccessStatusCode)
    {
        return response.Content.ReadAsAsync<int>().Result;
    }
}

我的API控制器方法是这样的

[ActionName("Method")]
[HttpGet]
public int Method([FromBody] ContactWF userwf)
{
    return 10;
}

它工作正常...

我的问题是当我尝试序列化参数 class 实例时 我替换行

HttpResponseMessage response = await client.PostAsJsonAsync(apiUrl + "Contact/Method", contactWF);

用这个

string jsonData = JsonConvert.SerializeObject(contactWF);
HttpResponseMessage response = client.PostAsJsonAsync("api/Contact/Method", jsonData).Result;

我有一个 Error:405...

它看起来像 Json 字符串,它不被识别为参数。

我的 Json 字符串看起来像这样。

"{\"Contact_id\":0,\"Description\":null,\"ProcessState_id\":2,\"Type_id\":0,\"Object_id\":0,\"Parent_id\":null}"

即 ContactWD class 转换为 json。

怎么了?

在您的 api 控制器中将动词更改为 HttpPost

[ActionName("Method")]
[HttpPost]
public int Method([FromBody] ContactWF userwf)
{
    return 10;
}

更新

您不需要在 PostAsJsonAsync

中序列化对象
HttpResponseMessage response = client.PostAsJsonAsync("api/Contact/Method", contactWF).Result;

看看微软的示例代码 https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/testing

internal class NewIdeaDto
    {
        public NewIdeaDto(string name, string description, int sessionId)
        {
            Name = name;
            Description = description;
            SessionId = sessionId;
        }

        public string Name { get; set; }
        public string Description { get; set; }
        public int SessionId { get; set; }
    }

//Arrange
var newIdea = new NewIdeaDto("Name", "", 1);

// Act
var response = await _client.PostAsJsonAsync("/api/ideas/create", newIdea);

// Assert
Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);

方法 PostAsJsonAsync 自己序列化参数对象,因此它再次序列化了您的 json string

如果你出于某种原因需要自己序列化对象,那么使用方法HttpClient.PostAsync

string jsonData = JsonConvert.SerializeObject(contactWF);
var stringContent = new StringContent(jsonData, Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PostAsync("api/Filler/CountMensajeByUser", stringContent);