2012-06-27 2 views
1

Я прочитал каждое сообщение об этой проблеме, но ничто не решило проблему. Буду рад, если кто-то может мне помочь.Функция Asp.net WebService не возвращается JSON

Существует проект MVC3 с веб-сервисом, который я добавил. У меня есть только одна функция Test, и когда я вызываю ее через HTTP GET-метод (обычный url), он возвращает данные с XML-форматом вместо JSON. Как я могу вернуть JSON?

Веб-сервис:

namespace TestServer 
{ 
    [WebService] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    [System.ComponentModel.ToolboxItem(false)] 
    [System.Web.Script.Services.ScriptService] 
    public class TestWebservice : System.Web.Services.WebService 
    { 
     [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
     [WebMethod] 
     public List<string> Test() 
     {  
      return new List<string> 
       { 
        {"Test1"}, 
        {"Test2"} 
       };      
     } 
    } 
} 

web.config, (только соответствующие разделы):

<configuration> 
    <location path="TestWebservice.asmx"> 
    <system.web> 
     <webServices> 
     <protocols> 
      <add name="HttpGet"/> 
     </protocols> 
     </webServices> 
    </system.web> 
    </location> 
    <system.web> 
    <webServices> 
     <protocols> 
     <clear/> 
     </protocols> 
    </webServices> 
    <httpHandlers> 
     <remove verb="*" path="*.asmx"/> 
     <add verb="*" path="*.asmx" 
     type="System.Web.Script.Services.ScriptHandlerFactory" 
     validate="false"/> 
    </httpHandlers> 
    </system.web> 
</configuration> 


URL-адрес:

http://localhost:49740/testwebservice.asmx/Test 


Результат (который не то, что я хочу):

<?xml version="1.0" encoding="utf-8"?> 
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/"> 
    <string>Test1</string> 
    <string>Test2</string> 
</ArrayOfString> 


Я буду рад, если кто-то может мне помочь.

ответ

3

При отправке запроса необходимо указать HTTP-заголовок типа контента application/json. Например, если вы используете JQuery AJAX вы можете сделать следующее:

$.ajax({ 
    url: '/testwebservice.asmx/Test', 
    type: 'GET', 
    contentType: 'application/json', 
    success: function(result) { 
     alert(result.d[0]); 
    } 
}); 

Кроме того, необходимо включить глагол GET на вашем [ScriptMethod] атрибута:

[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)] 
[WebMethod] 
public List<string> Test() 
{ 
    return new List<string> 
    { 
     {"Test1"}, 
     {"Test2"} 
    }; 
} 

Вы можете также избавиться от всего, вы положили в вашем web.config об этой услуге. Это необязательно.

О, и, кстати, классические веб-службы ASMX - это устаревшая технология. Вам следует использовать более современные технологии, такие как действия контроллера ASP.NET MVC, возвращающие JSON, WCF или даже веб-API ASP.NET MVC 4 с кратким выпуском.

+0

О, хорошо, теперь я понимаю проблему. Я просто попытался открыть URL-адрес через мой браузер. Фактическое использование - от iOS, поэтому мне нужно найти способ указать заголовок типа запроса в коде. Кстати, если я решила использовать веб-API MVC 4, я боюсь, что не смогу найти хостинговые сайты, которые его поддерживают. Я прав? – Edi

+0

Нет, вы не правы, потому что вы всегда можете выполнить развертывание bin. Вам не нужен сайт хостинга для поддержки чего-либо. Пока он поддерживает ASP.NET 4.0, вы можете разместить его без каких-либо проблем. –

+0

Получил это. Поэтому я буду использовать новую веб-api. Благодаря! – Edi

0

Служба REST сериализует данные в определенном формате (XML, JSON) на основе заголовка Accept, отправляемого от клиента. Это заголовок Accept, который сообщает службе, которую форматы могут принимать клиент.

Когда вы пытаетесь получить доступ к сервису непосредственно из браузера URL значение заголовка Accept устанавливается в значение некоторого по умолчанию, как показано ниже (в Firefox)

text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 

выше заголовок прямо говорит, что я могу принять html, xhtml или xml. Поскольку формат application/xml явно указан, но не application/json, служба REST возвращает данные в формате xml. (Я не понимаю, что такое использование ResponseFormat = ResponseFormat.Json).

Итак, если вы хотите, чтобы служба возвращала данные JSON, вы должны указать заголовок accept соответствующего формата.Если вы используете jQuery, вы можете использовать $.getJSON(), который установит заголовок принятия как "application/json", или вы даже можете использовать $.ajax с dataType как json.

http://prideparrot.com/blog/archive/2011/9/returning_json_from_wcfwebapi

+0

Отлично. спасибо за объяснение заголовка. Я найду способ указать его в коде приложения iOS. Также вы дали полезную ссылку - теперь я понимаю, что мне нужно создать веб-сервис как WCF. – Edi

+0

@Edi В ссылке, которую я поделил, служба создается с использованием WCF Web API. Теперь они объединили это в ASP.NET Web API. Поэтому, если вы собираетесь создать службу REST, вам лучше проверить ее с помощью http://www.asp.net/web-api. – VJAI

+0

Прохладный! Учебник по ссылке, которую вы дали, именно то, что я искал! Просто маленький вопрос - делают ли сайты хостинга новой технологией? – Edi

Смежные вопросы