ASP .Net Web API传递对象

时间:2016-05-26 10:32:14

标签: c# post asp.net-web-api

我有一个小的测试应用程序,一个.NET Web API和一个用于共享某些类的库。

我的目标是通过POST请求将对象传递给api。

这就是我的程序的样子:

var metadata = new Metadata(); // Metadata is a empty class in my library

try
{
    var postData = ByteConverter.ObjectToByteArray(metadata); // ByteConverter.ObjectToByteArray is method in my library to convert objects to a byte array

    var request =
        (HttpWebRequest)WebRequest.Create("http://localhost:65160/test");

    request.Method = "POST";
    request.ContentType = "application/json";
    request.ContentLength = postData.Length;

    using (var stream = request.GetRequestStream())
    {
        stream.Write(postData, 0, postData.Length);
    }

    await request.GetResponseAsync();
}
catch (Exception ex)
{
    // ignored
}

这就是我api的POST方法的样子:

[HttpPost]
public HttpResponseMessage Test([FromBody] Metadata metadata)
{
    return Request.CreateResponse(HttpStatusCode.OK);
}

调用my api的方法,但元数据参数始终为null。我需要做些什么才能让它发挥作用?

编辑:

根据要求:

public static byte[] ObjectToByteArray(object obj)
{
    if(obj == null)
        throw new ArgumentNullException($"The parameter {nameof(obj)} can't be null");

    try
    {
        var bf = new BinaryFormatter();
        using (var ms = new MemoryStream())
        {
            bf.Serialize(ms, obj);
            return ms.ToArray();
        }
    }
    catch (SerializationException)
    {
        throw;
    }
    catch
    {
        return new byte[0];
    }
}

2 个答案:

答案 0 :(得分:2)

您正在尝试以二进制格式向API发送数据,但当然,您的API需要一个JSON正文(您甚至将application/json声明为Content-Type)。这可能永远不会奏效。

如果您希望保持代码不变,则需要在将方法中的请求主体写入之前将对象序列化为JSON。要实现这一点,您应该使用像Json.NET这样的库(使用此NuGet package安装它)。

这是一个小样本:

public static byte[] ObjectToByteArray(object obj)
{
    if(obj == null)
        throw new ArgumentNullException($"The parameter {nameof(obj)} can't be null");

    var json = JsonConvert.SerializeObject(obj);

    var bytes = Encoding.UTF8.GetBytes(json);

    return bytes;
}

虽然这应该有效,但我强烈建议您不要手动完成所有这些操作,并使用其他答案中所述的HttpClient,或者(甚至更好)完整的REST客户端库,如Rest Sharp。< / p>

答案 1 :(得分:0)

我正在使用HttpClient并且没有遇到任何问题。需要添加nuget包System.Net.Http.Formatting。 PostAsJsonAsync是HttpClientExtensions的一部分。以下是示例代码:

using System.Net.Http;
// ....

using (var client = new HttpClient())
{
      string url = "http://localhost:65160/test"; // <= set valid URL
      var metadata = new Metadata();

      client.DefaultRequestHeaders.Accept.Clear();
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
      var response = await client.PostAsJsonAsync(url, metadata);
      response.EnsureSuccessStatusCode();
}