2010-05-08 8 views
1

Наша компания работает с другой компанией iMatrix, и у них есть API для создания наших собственных форм. Они подтвердили, что наш запрос попадает на их серверы, но ответ должен возвращаться в 1 из нескольких способов, определяемых параметром. Я получаю ответ 200 OK, но без содержимого и длины содержимого 0 в заголовке ответа.HTTPWebResponse не возвращает контент

вот URL: https://secure4.office2office.com/designcenter/api/imx_api_call.asp

Я использую этот класс:

имен WebSumit { общественное перечисление MethodType { POST = 0, GET = 1 }

public class WebSumitter 
{ 

    public WebSumitter() 
    { 
    } 

    public string Submit(string URL, Dictionary<string, string> Parameters, MethodType Method) 
    { 
     StringBuilder _Content = new StringBuilder(); 
     string _ParametersString = ""; 

     // Prepare Parameters String 
     foreach (KeyValuePair<string, string> _Parameter in Parameters) 
     { 
      _ParametersString = _ParametersString + (_ParametersString != "" ? "&" : "") + string.Format("{0}={1}", _Parameter.Key, _Parameter.Value); 
     } 

     // Initialize Web Request 
     HttpWebRequest _Request = (HttpWebRequest)WebRequest.Create(URL); 
     // Request Method 
     _Request.Method = Method == MethodType.POST ? "POST" : (Method == MethodType.GET ? "GET" : ""); 

     _Request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Win32)"; 
     // Send Request 
     using (StreamWriter _Writer = new StreamWriter(_Request.GetRequestStream(), Encoding.UTF8)) 
     { 
      _Writer.Write(_ParametersString); 
     } 
     // Initialize Web Response 

     HttpWebResponse _Response = (HttpWebResponse)_Request.GetResponse(); 


     // Get Response 
     using (StreamReader _Reader = new StreamReader(_Response.GetResponseStream(), Encoding.UTF8)) 
     { 
      _Content.Append(_Reader.ReadToEnd()); 
     } 

     return _Content.ToString(); 
    } 

} 

Я не могу опубликовать фактические параметры, потому что они находятся в живой системе, но можете ли вы посмотреть на этот код и посмотреть, нет ли чего-то, чего не хватает?

Спасибо!

ответ

1

Используйте Fiddler, чтобы увидеть, действительно ли какой-либо ответ возвращается через сетевой провод. Похоже, сервер посылает вам пустой ответ 200 OK.

+0

http://www.fiddler2.com/fiddler2/ – dthorpe

2

Несколько очевидных проблем:

  • вы не URL-кодирующие ваши параметры запроса. Если в ваших значениях есть какие-либо пробелы или специальные символы, сервер может заблокировать ваш ввод или усечь его.
  • Вы пытаетесь отправить данные в тело метода, даже если метод GET - это не удастся. Вам нужно вставить значения в строку запроса URL, если это GET.
  • Вы пытаетесь свернуть свою собственную версию WebClient вместо того, чтобы просто использовать WebClient. Ниже приведен образец WebClient, который обрабатывает URL-кодирование параметров, правильно обрабатывает GET и POST и т. Д.

.

public class WebSumitter 
{ 
    public string Submit(string URL, Dictionary<string, string> Parameters, MethodType Method) 
    { 
     // Prepare Parameters String 
     var values = new System.Collections.Specialized.NameValueCollection(); 
     foreach (KeyValuePair<string, string> _Parameter in Parameters) 
     { 
      values.Add (_Parameter.Key, _Parameter.Value); 
     } 

     WebClient wc = new WebClient(); 
     wc.Headers[HttpRequestHeader.UserAgent] = "Mozilla/4.0 (compatible; MSIE 6.0; Win32)"; 
     if (Method == MethodType.GET) 
     { 
      UriBuilder _builder = new UriBuilder(URL); 
      if (values.Count > 0) 
       _builder.Query = ToQueryString (values); 
      string _stringResults = wc.DownloadString(_builder.Uri); 
      return _stringResults; 
     } 
     else if (Method == MethodType.POST) 
     { 
      byte[] _byteResults = wc.UploadValues (URL, "POST", values); 
      string _stringResults = Encoding.UTF8.GetString (_byteResults); 
      return _stringResults; 
     } 
     else 
     { 
      throw new NotSupportedException ("Unknown HTTP Method"); 
     } 
    } 
    private string ToQueryString(System.Collections.Specialized.NameValueCollection nvc) 
    { 
     return "?" + string.Join("&", Array.ConvertAll(nvc.AllKeys, 
      key => string.Format("{0}={1}", System.Web.HttpUtility.UrlEncode(key), System.Web.HttpUtility.UrlEncode(nvc[key])))); 
    } 
}