C# Post复杂类型,格式为使用ASP.Net HttpClient编码的表单url
我需要C# Post复杂类型,格式为使用ASP.Net HttpClient编码的表单url,c#,asp.net-web-api,C#,Asp.net Web Api,我需要httppost将复杂类型发布到web服务(我无法控制)。我相信web服务是使用旧版本的ASP.NET MVC构建的。It模型绑定格式为的有效载荷,格式为url编码 如果我向它发射以下命令,它将完美工作。如您所见,我已经手动创建了一组键/值对 var values = new List<KeyValuePair<string, string>> { new KeyValuePair<string, string>("Use
httppost
将复杂类型发布到web服务(我无法控制)。我相信web服务是使用旧版本的ASP.NET MVC构建的。It模型绑定格式为的有效载荷,格式为url编码
如果我向它发射以下命令,它将完美工作。如您所见,我已经手动创建了一组键/值对
var values = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("Username", "some-username"),
new KeyValuePair<string, string>("Password", "some-password"),
new KeyValuePair<string, string>("Product", "some-product")
};
var content = new FormUrlEncodedContent(values);
var response = new HttpClient().PostAsync(url, content).Result;
我相信以前会有一条HttpRequestMessage
,但是为了支持
HttpClient.PostAsJsonAsync(T值)发送“应用程序/json”
HttpClient.PostAsXmlAsync(T值)发送“application/xml”
但我不想发送Json
或XML
我想发送form url ecncoded
,而不需要将复杂类型转换为键/值对集合
基本上,我也想知道Jaans摆出的姿势的答案(他的是第二个答案的第二条评论)
谁能给点建议吗。既然你几乎有了一个可行的解决方案,我想说就这么做吧。在扩展方法中组织代码,以便您可以使用该方法发布,例如:
public static async Task<HttpResponseMessage> PostAsFormUrlEncodedAsync<T>(
this HttpClient httpClient, T value)
{
// Implementation
}
公共静态异步任务PostAsFormUrlEncodedAsync(
此HttpClient(HttpClient,T值)
{
//实施
}
您的实现只需要将对象序列化为表单编码的值,这应该可以通过反射轻松完成
然后,您可以像调用JSON或XML一样调用代码。[披露:我是作者]提供了一种似乎正是您想要的方法:
using Flurl.Http;
var resp = await url.PostUrlEncodedAsync(new {
Username = "some-username",
Password = "some-password",
Product = "some-product",
});
Flurl小巧便携,在引擎盖下使用HttpClient
。可通过NuGet获得:
PM> Install-Package Flurl.Http
您可以这样做:
var content = new ComplexType("some-username", "some-password", "some-product");
var response = new HttpClient().PostAsync<ComplexType>(url, content, new FormUrlEncodedMediaTypeFormatter()).Result;
var content=newcomplexType(“一些用户名”、“一些密码”、“一些产品”);
var response=new-HttpClient().PostAsync(url、内容、新FormUrlEncodedMediaTypeFormatter()).Result;
Web API确实有一个FormUrlEncodedMediaTypeFormatter
,但该格式化程序不能“写”,只能“读”。因此,WebAPI对此没有现成的支持。这真是太遗憾了。有人知道有什么好的工作吗?您可能可以看看Carlos:提供的自定义格式化程序,但这里讨论的是从JObject到FormUrlEncoded的转换。我不喜欢这样建议,但您可能可以使用Json.net序列化程序将complextype转换为JObject,然后按照链接中的建议将此JObject转换为formurlencoded。这可能是一种方法。谢谢Kirant这看起来正是我想要的。我可能错了,但我认为当我最初提出这个问题时,这个功能是不可用的。否则为什么@ToddMenier会编写他的Flurl库?也就是说,感谢您的回答,它可能会帮助其他人继续前进。不幸的是,这不起作用,因为FormUrlEncodedMediaTypeFormatter
不会序列化任意类型。您必须使用另一个库,FormUrlEncodedContent
或使用反射
var content = new ComplexType("some-username", "some-password", "some-product");
var response = new HttpClient().PostAsync<ComplexType>(url, content, new FormUrlEncodedMediaTypeFormatter()).Result;