2016-02-16 3 views
0

Я хочу сделать запрос Json Post с моим Windows Universal App. У меня он работает в моих Android и IOS.Windows-Universal https Post Xamarin Forms

public String DoServiceCall() 
    { 
     var request = (HttpWebRequest)WebRequest.Create(string.Format("{2}/{0}/{0}ServiceJson.svc/{1}", "Authentication", "Authenticate", "https://.....")); 

     using (MemoryStream ms = new MemoryStream()) 
     { 
      // create the request object 
      string requestString = JSONRequest; 
      byte[] requestData = Encoding.UTF8.GetBytes(requestString); 
      request.Method = "POST"; 
      request.ContentType = "application/json; charset=UTF-8"; 
      request.ContentLength = requestData.Length; 
      request.AllowAutoRedirect = false; 

      // add known cookies to request (needed for authentication) 
      CookieContainer requestCookies = new CookieContainer(); 
      foreach (Cookie knownCookie in this._cookieCollection) 
      { 
       requestCookies.Add(knownCookie); 
      } 
      request.CookieContainer = requestCookies; 

      //For getting rid of the https Problem 
      ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; 

      using (Stream stream = request.GetRequestStream()) 
      { 
       stream.Write(requestData, 0, requestData.Length); 
      } 
      // get response data 
      HttpWebResponse response = (HttpWebResponse) request.GetResponse(); 

      string responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); 
      return (responseString); 
     } 
    } 

Проблема в том, что Windows Universal не поддерживает.

request.ContentLength = requestData.Length; 
request.AllowAutoRedirect = false; 
requestCookies.Add(knownCookie); //with only one Argument 
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; 

Он также не поддерживает.

request.GetRequestStream()) 
(HttpWebResponse) request.GetResponse(); 

Но что я мог установить с асинхронным

await request.GetRequestStreamAsync()) 
(HttpWebResponse)await request.GetResponseAsync(); 

Но без этого 4 линии я couldn't заставить его работать на Windows. Я просто не получаю ответа. Есть ли возможность заставить его работать в Windows 10 или есть рабочая альтернатива.

+0

Попробуйте [это] (http://stackoverflow.com/a/35273153/3956290) ответ. –

+0

Пробовал, все еще не получил ответа. Я думаю, что это может быть проблема с пользовательским SSL Zertifikat. – Olias

+1

Вы этого не сделали, проверьте класс HttpClient, он делает все, что вам нужно. –

ответ

0

Итак, я наконец нашел решение. Основываясь на комментарии, я попробовал HttpClient. Но Stanard Httpclient в системном пространстве имен не поддерживает фильтр, который мне нужно получить, чтобы получить сертификат SSL. К счастью, в пространстве имен Windows.Web.Http есть еще один HttpClient, который поддерживает фильтры. Ответ - полностью функциональный почтовый вызов HttpClient.

public async void testcallwind() 
    { 
     List<HttpCookie> cookieCollection = new List<HttpCookie>(); 
     HttpBaseProtocolFilter filter = new HttpBaseProtocolFilter(); 
     HttpClient httpClient; 
     filter.IgnorableServerCertificateErrors.Add(ChainValidationResult.Untrusted);//Allow untrusted CA's 
     filter.IgnorableServerCertificateErrors.Add(ChainValidationResult.Expired); 
     // add known cookies to request (needed for authentication) 
     foreach (HttpCookie knownCookie in cookieCollection) 
     { 
      filter.CookieManager.SetCookie(knownCookie); 
     } 
     httpClient = new HttpClient(filter); 
     string resourceAddress = string.Format("https://..."); 
     string requestString = "{\"request\":{\"CallerState\":null,...."}}"; 
     byte[] requestData = Encoding.UTF8.GetBytes(requestString);   
     UnicodeEncoding en = new UnicodeEncoding(); 

     IHttpContent content = new HttpStringContent(requestString, 0, "application/json"); 
     Uri postBody = new Uri(resourceAddress);    

     var response = await httpClient.PostAsync(postBody, content); 
     httpClient.Dispose(); 
     var test = response.Content; 
    }