Веб-сервис отказывается принимать параметры и отвечать в JSON - PullRequest
5 голосов
/ 05 октября 2010

Я пытаюсь вызвать веб-сервис (.asmx) из приложения ac # в формате json.

Когда я указываю метод запроса как GET и не указываю contentType.

(требуется HttpWebRequest)

req.Method = "GET";

Все работает хорошо, но я получаю XML-ответ.
Когда я указываю Тип содержимого:

req.ContentType = "application/json; charset=utf-8";  

Я получаю

500 внутренняя ошибка сервера.

Когда я меняю метод запроса:

req.Method = "POST";  

Я могу вызывать только беспараметрические методы, которые правильно возвращают json,но если я попытаюсь вызвать метод с параметрами, я снова получу ошибку 500.

Код веб-службы:

    [WebMethod(EnableSession =true)]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string SimplestWebService()
    {         
        return "hello";
    }  

И с параметрами:

    [WebMethod(EnableSession = true)]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string Echo(string aString)
    {       
        return aString;
    }

Любые идеи будут высоко оценены.

Добавлено: Возможно, я неправильно пишу запрос POST (сейчас я отправляю его в заголовке, как запрос GET).Может кто-нибудь, пожалуйста, наставить меня на это?

Добавлен режим: Веб-сайт действительно помечен как скрипт:

[ScriptService]
public class MyAPI : System.Web.Services.WebService  

И вот как я строю свой запрос POST (я действительно склонен полагать, что этопроблема):

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(methodUrl.ToString());
req.Method = "POST";
req.Headers.Add("aString","oren");
req.ContentLength = 0;    
...
req.ContentType = "application/json; charset=utf-8";
req.Accept = "application/json; charset=utf-8";
using (HttpWebResponse res = (HttpWebResponse)req.GetResponse())
{
  StreamReader sr = new StreamReader(res.GetResponseStream());
  result.Append(sr.ReadToEnd());
}  
...

Также пробовал:

req.Method = "POST";          
string postData = "aString=kjkjk";
req.ContentType = @"application/json; charset=utf-8";
req.Accept = @"application/json; charset=utf-8";   
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] byte1 = encoding.GetBytes(postData);
req.ContentLength = byte1.Length;
Stream newStream = req.GetRequestStream();
newStream.Write(byte1, 0, byte1.Length);
newStream.Close();           

Два последних замечания:
1. Этот веб-сервис работает в XML с использованием браузера.
2. Запрашиваемаяjson, код никогда не достигает точки останова в веб-сервисе .Так что, возможно, это проблема IIS (я использую IIS 6.1).Я попробовал рекомендацию типа MIME здесь .

Большое спасибо.

Ответы [ 2 ]

5 голосов
/ 07 октября 2010

Обновление 2:

Я использую fiddler2 для просмотра успешного POST-запроса (от jquery до моей службы asmx) и вижу разницу, которую стоит проверить:

Accept: application/json, text/javascript, */*

Есть и другие отличия, но эта единственная, которая выпадает в качестве возможного курящего пистолета.

Обновленный ответ (в ответ на обновленный вопрос):

Похоже, вы правильно используете contentStream.Однако данные, которые вы помещаете на него ("aString = kjkjk"), не являются допустимыми JSON.Как указано ниже, ваши данные, вероятно, должны быть в правильном формате JSON:

{'aString':'kjkjk'}

Оригинальный ответ:

Я полагаю, вы устанавливаете "aString"содержание неправильно.Для запросов POST-метода данные «полезной нагрузки» не применяются к заголовку, это содержимое самого запроса.Следовательно, вам необходимо передать его на объект запроса;см. эту ссылку MSDN для примера.Не забудьте также указать длину содержимого в запросе.

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

{'aString':'This is the text I want to echo.'}

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

0 голосов
/ 05 октября 2010

ContentType мне кажется типом содержимого запроса , а не ответа. Что произойдет, если вместо этого вы отправите заголовок Accept (информирующий сервер о типах контента, которые вы готовы принять).

...