2016-07-28 115 views
0

我正在处理一个asp.net mvc-4 web应用程序,并且我有以下方法将json对象上传到第三方应用程序。在这里我想URL标头设置为application/x-www-form-urlencoded: -无法从'字符串'转换为'System.Collections.Specialized.NameValueCollection'

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)' 具有一些无效 论据

所以任何人都可以请这个请吗?

回答

2

错误很明显。 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); 

更新

你可以尝试UploadString代替:https://msdn.microsoft.com/en-us/library/0645045y(v=vs.110).aspx

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

不知道为什么你正在使用这个myNameValueCollection.Add( “INPUT_DATA” ,encodedJson)..现在在我的情况下,json应该以“INPUT_DATA =”开头,所以我需要在“INPUT_DATA =”和encodedJson之间进行一次concatitation,如我的原始代码所示。 –

+0

然后尝试'UploadString'。你问为什么你得到的错误,所有这些答案修复了 – Eonasdan

+0

但我想使用UploadValues,因为我想指定内容类型头为应用程序/ x-www-form-urlencoded,因为我知道我不能做所以使用UploadString? –

3

您需要定义一个新的NameValueCollection和传递给UploadValues

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

但我需要将“INPUT_DATA”和encodedJson连接在一起,如图所示在我的原始代码中。 –

3

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); 
    } 
+0

不知道为什么你要使用myNameValueCollection.Add(“INPUT_DATA”,encodedJson)..在我的情况下,json应该从“INPUT_DATA =”开始,所以我需要在“INPUT_DATA =”和encodedJson之间进行一次concatitation,如我的原始代码所示。 –

+0

但是如果你像这样追加它,那么你的json变得无效了吗?我们假定Input_data是post方法的内容主体的属性名称或调用方法的参数。如果你真的需要这样做,在编码add-data = data +“INPUT_DATA =” – ssilas777

+0

之前,现在JSON格式应该以INPUT_DATA =开头......然后我将添加我的序列化数据给它... –