我有一个小的测试应用程序,一个.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];
}
}
答案 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();
}