2014-11-10 7 views
5

Ich erhalte eine Ausnahme als "Der Header hat einen leeren Wert". Dies ist die POST-Anfrage. In einigen Fällen muss ich einen Header-Wert als leer senden.System.ArgumentException: Der Header hat einen leeren Wert

Dies ist mein Code:

private void Start() 
{ 
    try 
    { 
     this.webRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(this.requestURL); 
     //this.webRequest.Headers[HttpRequestHeader.UserAgent] = this.userAgent; 
     webRequest.Headers[HttpRequestHeader.CacheControl] = "no-cache"; 
     webRequest.Headers[HttpRequestHeader.Pragma] = "no-cache"; 
     webRequest.Headers[HttpRequestHeader.IfModifiedSince] = DateTime.UtcNow.ToString(); 
     webRequest.Method = "POST"; 

     if (headers != null && headers.Count > 0) 
     { 
      webRequest.Headers["some-Header"] = ""; 
     } 

     IAsyncResult result = this.webRequest.BeginGetRequestStream(new AsyncCallback(RequestCallback), webRequest); 
    } 
    catch (Exception ex) 
    { 
    } 
} 

void RequestCallback(IAsyncResult result) 
{ 
    HttpWebRequest request = (HttpWebRequest)result.AsyncState; 

    //if (RequestBody != null) 
    { 
     using (Stream postStream = request.EndGetRequestStream(result)) 
     { 
      using (var writer = new StreamWriter(postStream)) 
      { 
       writer.Write(string.Empty); 
       writer.Flush(); 
       postStream.Position = 0; 
       byte[] mArray = new byte[postStream.Length]; 
       postStream.Read(mArray, 0, (int)postStream.Length); 
      } 
     } 
    } 

    request.BeginGetResponse(new AsyncCallback(OnRequestResponse), request); 
} 

private void OnRequestResponse(IAsyncResult ar) 
{ 
    try 
    { 
     System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)this.webRequest.EndGetResponse(ar); 
     webResponseHeaders = response.Headers.GetHeaders(); 
     System.IO.Stream responseStream = response.GetResponseStream(); 
    } 
    catch (Exception ex) 
    { 
    } 
} 

Erste Ausnahme in OnRequestResponse Rückruf bei System.Net.HttpWebResponse response = (System.Net.HttpWebResponse) this.webRequest.EndGetResponse (ar);

Antwort

1

Die erste Sache ist, versuchen Sie, Ihre Lösung auf Windows Phone 8.1 zu aktualisieren. Es gibt 2 Option: Silverlight 8.1 (Sie können jeden Code wiederverwenden) oder WP 8.1 RT (Einfach Code zwischen WP und Windows 8.1 wiederverwenden). Ich empfehle Silverlight 8.1, da Sie Silverlight 8.0 App bereits in Entwicklung haben.

Zweite Dinge: Callback ist ein bisschen alt. Erwägen Sie, Ihren Code auf Await und Async-Methode zu aktualisieren, da es natürlich unterstützt wird

Für Ihre Probleme versuchen Sie, HttpClient, um eine Anforderung zu senden. Hier ein Codebeispiel:

public static async Task<string> GetHttpAsStringTask(string uriString) 
    { 
     string result; 

     Uri targetUri = new Uri(uriString); 

     HttpClient client = new HttpClient(); 
     HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, targetUri); 
     //Add your empty header here 
     request.Headers.Add("Header name","header value"); 
     HttpResponseMessage response = await client.SendAsync(request); 

     using (Stream responseStream = await response.Content.ReadAsStreamAsync()) 
     { 
      StreamReader reader = new StreamReader(responseStream, Encoding.UTF8); 
      result = reader.ReadToEnd(); 
     } 

     return result; 
    } 

Verbrauch:

string response = await GetHttpAsStringTask("your url"); 

für await und async in WP 8: http://developer.nokia.com/community/wiki/Asynchronous_Programming_For_Windows_Phone_8

+0

Meine Frage ist, über leere Header in HTTP-Anfrage gesendet werden. Nicht über Rückrufe. – nucleons

+1

hast du meinen Vorschlag ausprobiert? Vielleicht wird es funktionieren –

+0

@nucleons Sie haben tatsächlich nicht eine Frage oben gestellt. Ich sehe jedoch ein unterschiedliches Verhalten bei der Verarbeitung von leeren Headern auf verschiedenen Plattformen. AFAICS Windows 8.1 app sendet leere Header, WPA10 streift sie von der Anfrage nach Fiddler. –

Verwandte Themen