2015-03-05 3 views
0

У меня есть веб-сервис, который создает пакет JSON (или что вы хотите назвать его), как это:Потребляя WebService из консольного приложения

[WebMethod] 
     [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
     public void MyMethod(string letters, int number) 
     { 
      try 
      { 
       Dictionary<string, object> result = new Dictionary<string, object>(); 

       //Do some stuff here 

       result.Add("data1", 1); 
       result.Add("data2", "second value"); 

       JavaScriptSerializer s= new JavaScriptSerializer(); 
       Context.Response.Clear(); 
       Context.Response.ContentType = "application/json; charset=utf-8"; 
       Context.Response.Flush(); 
       Context.Response.Write(s.Serialize(result)); 
      } 
      catch (Exception ex) 
      { 

      } 
     } 

Когда я проверить это я получаю хороший ответ вроде следующие: {"data1": 1, "data2": "second value."}

Проблема в том, что я развернул его на тестовом сервере и создал простое консольное приложение, чтобы попытаться заставить его работать , Вот приложение, которое пытается использовать службу. Считайте, что я добавил веб-ссылку и назвал его MyWS, поэтому пространство имен и класс имеют такое же имя (не то, что вызывает проблемы):

class Program 
    { 
     static void Main(string[] args) 
     { 
      MyWS.MyWS x = new MyWS.MyWS(); 
      x.Timeout = 5000; 
      try 
      { 
       x.MyMethod("Hello World", 1); 
      } 
      catch (Exception ex) 
      { 
       Console.Write(ex.ToString()); 
      } 
      Console.ReadLine(); 
     } 


    } 

Когда я запускаю это, я знаю, что веб-сервис был достигнут , Часть «Do some stuff here» в WS записывает в базу данных. Он делает это, без проблем, поэтому проблема должна быть после этого.

Единственная ошибка, которую я получаю, - это код 500 без реального смысла. Оглядываясь, я обнаружил, что это может быть метод .Flush(), поэтому я удалил эту строку и что для параметра Context.Response.BufferOutput должно быть установлено значение true. Сделал это, не получилось.

О, и (возможно), чтобы ухудшить ситуацию, WS будет позже поглощен Android-приложением. Но сначала первое: что мне не хватает?

+1

Вместо того, чтобы просто игнорировать ваш 'catch' на сервере, почему вы не регистрируете исключение и не говорите нам, что он говорит? Ошибка '500' означает внутреннюю ошибку сервера и обычно имеет связанное с ней сообщение. Обработка ошибок - это ключ при работе с клиентом/сервером! – Belogix

+0

Уловка здесь не применяется. Я имею в виду, если я отлаживаю шаг за шагом консольное приложение и вводим метод, я могу пройти весь путь, не дойдя до блока catch. Это продолжается, но когда он обычно выходит из веб-метода, я получаю исключение в функции 'main', и что он говорит, что ответ не является надлежащим XML-кодом. Это не должно быть, это должен быть JSON, поэтому консольное приложение должно ожидать его как такового. В любом случае возникает ошибка между ответом, отправленным веб-службой, и его получением приложением. Есть предположения? – MaoMonroy

+0

Я немного изменил его, но ответ, который я получаю, является фактической страницей, отображаемой при запуске веб-службы, и она открывается в браузере, то есть я получаю фактический код HTML, который он генерирует, когда я нажимаю F5, чтобы запустить его , Я отправляю новый код. – MaoMonroy

ответ

0

Ну, оказывается, я нашел решение самостоятельно, после всего ... ну, все еще просматривая Интернет. Вот код, который работает. Nevermind имена переменных на испанском языке (я мексиканский, живущий в Мехико). Кстати, я нашел решение на форуме на испанском языке, поэтому он рассчитывает узнать больше о вашем родном языке. =) Это все внутри основного метода консольного приложения.

string datos = ""; 

    string url = "http://server.com/wsDirectory/wsFile.asmx/MethodName?param1=value1&param2=value2"; 
    string respuesta = ""; 

    try 
    { 
     byte[] buffer = Encoding.ASCII.GetBytes(datos); 
     System.Net.HttpWebRequest solicitud = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url); 
     solicitud.Method = "GET"; 
     solicitud.ContentLength = buffer.Length; 
     System.Net.HttpWebResponse r = (System.Net.HttpWebResponse)solicitud.GetResponse(); 
     System.IO.Stream datosRespuesta = r.GetResponseStream(); 
     System.IO.StreamReader lector = new System.IO.StreamReader(datosRespuesta); 
     respuesta = lector.ReadToEnd(); 
     System.Web.Script.Serialization.JavaScriptSerializer serializador = new System.Web.Script.Serialization.JavaScriptSerializer(); 
     Dictionary<string, object> resultado = (Dictionary<string, object>)serializador.Deserialize<object>(respuesta); 
     Console.Write("Resultado obtenido: " + resultado.ToString()); 

    } 
    catch (Exception ex) 
    { 
     Console.Write(ex.ToString()); 
    } 
    Console.ReadLine(); 
Смежные вопросы