【问题标题】:cannot convert from 'string' to 'System.Collections.Specialized.NameValueCollection'无法从“字符串”转换为“System.Collections.Specialized.NameValueCollection”
【发布时间】:2016-12-02 21:23:32
【问题描述】:

我正在开发一个 asp.net mvc-4 Web 应用程序,并且我有以下方法将 json 对象上传到第 3 部分应用程序。我想将 url 标头设置为application/x-www-form-urlencoded:-

using (WebClient wc = new WebClient()) 
                {
                    string url = currentURL + "resources?AUTHTOKEN=" + pmtoken;
                    Uri uri = new Uri(url);

                    wc.Headers.Add(HttpRequestHeader.ContentType, "application/x-www-form-urlencoded");

                    var encodedJson = WebUtility.UrlEncode(data);
                    crudoutput = wc.UploadValues(uri, "INPUT_DATA=" + encodedJson);
                }

但以上内容引发了以下错误:-

无法从“字符串”转换为 'System.Collections.Specialized.NameValueCollection'

最好的重载方法匹配 'System.Net.WebClient.UploadValues(System.Uri, System.Collections.Specialized.NameValueCollection)' 有一些无效 论据

请问有人可以推荐吗?

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-4 asp.net-mvc-5


    【解决方案1】:

    您需要定义一个新的NameValueCollection 并将其传递给UploadValues

    crudoutput = wc.UploadValues(uri, new NameValueCollection()
    {
        { "INPUT_DATA", encodedJson }
    });
    

    【讨论】:

    • 但我需要将“INPUT_DATA”和encodedJson 连接在一起,如我的原始代码中所示..
    【解决方案2】:

    WebClient UploadValues 方法需要 NameValueCollection 而不是 string 作为参数

    所以你可以试试这个:-

        using (WebClient wc = new WebClient()) 
         {
             string url = currentURL + "resources?AUTHTOKEN=" + pmtoken;
             Uri uri = new Uri(url);       
             wc.Headers.Add(HttpRequestHeader.ContentType, "application/x-www-form-urlencoded");
    
             var encodedJson = WebUtility.UrlEncode(data);
    
             NameValueCollection myNameValueCollection = new NameValueCollection();
             myNameValueCollection.Add("INPUT_DATA",encodedJson);
             crudoutput = wc.UploadValues(uri, myNameValueCollection);
         }
    

    【讨论】:

    • 不确定为什么要使用这个 myNameValueCollection.Add("INPUT_DATA",encodedJson) ..现在在我的情况下,json 应该以 "INPUT_DATA=" 开头,所以我需要在 "INPUT_DATA =" 和 encodedJson ,,如我的原始代码中所示..
    • 但是如果你像这样附加它,你的 json 会变得无效吗?我们假设 Input_data 是您的 post 方法的内容主体的属性名称或调用方法的参数。如果你真的需要,在编码之前添加 - data = data + "INPUT_DATA="
    • 现在 json 格式应该以 INPUT_DATA= 开头.. 然后我会添加我的序列化数据...
    【解决方案3】:

    错误很明显。 UploadValues 接受 NameValueCollection 而不是字符串 https://msdn.microsoft.com/en-us/library/9w7b4fz7(v=vs.110).aspx

    你的代码应该是

    var nvc = new NameValueCollection();
    
    nvc.Add("INPUT_DATA", encodedJson);
    
    crudoutput = wc.UploadValues(uri, nvc);
    

    更新

    你可以试试UploadStringhttps://msdn.microsoft.com/en-us/library/0645045y(v=vs.110).aspx

    crudoutput = wc.UploadString(uri, "INPUT_DATA=" + encodedJson);
    

    【讨论】:

    • 不确定为什么要使用这个 myNameValueCollection.Add("INPUT_DATA",encodedJson) ..现在在我的情况下,json 应该以 "INPUT_DATA=" 开头,所以我需要在 "INPUT_DATA =" 和 encodedJson ,,如我的原始代码中所示..
    • 然后试试UploadString。您询问了为什么会收到错误,所有这些答案都可以解决
    • 但我想使用 UploadValues 因为我想将内容类型标头指定为 application/x-www-form-urlencoded ,因为我知道我不能使用 UploadString 这样做??
    • 猜你必须向 .Net 库提出拉取请求,然后他们才能为你更改。如错误所述,您不能将字符串类型传递给UploadValues
    • 我确实理解您的观点“我猜您必须向 .Net 库提出拉取请求,然后他们才能为您更改它”??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 2021-10-09
    • 2021-06-17
    • 1970-01-01
    相关资源
    最近更新 更多