2015-04-07 88 views
0

我正在嘗試使用HttpClient通過Xamarin.iOS中的REST api將文件上傳到Microsoft Azure Blob存儲。到現在爲止一切都好。每次我試圖Content-Length頭添加到客戶端,我得到這個錯誤:Xamarin iOS添加內容長度頭到HttpClient拋出錯誤

System.InvalidOperationException: Content-Length\n at System.Net.Http.Headers.HttpHeaders.CheckName (System.String name) [0x0005f] in /Developer/MonoTouch/Source/mono/mcs/class/System.Net.Http/System.Net.Http.Headers/HttpHeaders.cs:253 \n at System.Net.Http.Headers.HttpHeaders.Add (System.String name, IEnumerable`1 values) [0x00011] in /Developer/MonoTouch/Source/mono/mcs/class/System.Net.Http/System.Net.Http.Headers/HttpHeaders.cs:171 \n at System.Net.Http.Headers.HttpHeaders.Add (System.String name, System.String value) [0x00000] in /Developer/MonoTouch/Source/mono/mcs/class/System.Net.Http/System.Net.Http.Headers/HttpHeaders.cs:163 

這是我的代碼創建HttpClient的

HttpClient client = new HttpClient(); 
client.DefaultRequestHeaders.Add("Content-Length", blobLength.ToString()); // Error here 
client.DefaultRequestHeaders.Add("x-ms-date", dateInRfc1123Format); 
client.DefaultRequestHeaders.Add("x-ms-version", msVersion); 
Debug.WriteLine("Added all headers except Authorization"); 
client.DefaultRequestHeaders.Add("Authorization", authorizationHeader); 


Debug.WriteLine("Added Authorization header"); 
//logRequest(requestContent, uri); 

Debug.WriteLine("created new http client"); 
HttpContent requestContent = new ByteArrayContent(blobckContent); 
HttpResponseMessage response = await client.PutAsync(uri, requestContent); 

我用,而不是添加TryAddWithoutValidation嘗試:

client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Length", blobLength.ToString()); 

錯誤不會被引發,但頭仍然不會被添加。 任何幫助將是偉大的。

回答

0

這是CheckName()的內部工作,它引發異常。您可以在這裏找到來源:https://github.com/mono/mono/blob/master/mcs/class/System.Net.Http/System.Net.Http.Headers/HttpHeaders.cs

HeaderInfo CheckName (string name) 
    { 
     if (string.IsNullOrEmpty (name)) 
      throw new ArgumentException ("name"); 

     Parser.Token.Check (name); 

     HeaderInfo headerInfo; 
     if (known_headers.TryGetValue (name, out headerInfo) && (headerInfo.HeaderKind & HeaderKind) == 0) { 
      if (HeaderKind != HttpHeaderKind.None && ((HeaderKind | headerInfo.HeaderKind) & HttpHeaderKind.Content) != 0) 
       throw new InvalidOperationException (name); 

      return null; 
     } 

     return headerInfo; 
    } 

看完整的源文件後:

看起來Content-Lengthknown_headers集合中

也看起來像Content-Length標頭值的內部類型是很長的。但Add()方法只爲該值取一個字符串,該值被解析爲一長段。您爲Content-Length值傳遞的字符串值是否有效?

相關問題