Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Post复杂类型,格式为使用ASP.Net HttpClient编码的表单url_C#_Asp.net Web Api - Fatal编程技术网

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;