2013-08-11 10 views
5

Utworzono usługę WWW JSON C# ASP.Net JSON WebService. Ale mam duże problemy z odczytaniem danych z tej usługi WebService, ponieważ w moich oczach wynik nie jest prawidłowym formatem JSON?Jak utworzyć usługę WWW JSON w języku C# ASP.Net z poprawnym wynikiem JSON i zapytaniem za pomocą JQuery/Ajax

Zwykle powinieneś otrzymać [obiekt, obiekt] z powrotem jako dane. Ale dostaję [obiekt, dokument] Co robię źle lub czego mi brakuje?

Moja prąd wyjściowy wygląda następująco:

<?xml version="1.0" encoding="utf-8"?> 
<string xmlns="http://tempuri.org/">{ 
    "Email": "[email protected]", 
    "Active": true, 
    "CreatedDate": "2013-01-20T00:00:00Z", 
    "Roles": [ 
    "User", 
    "Admin" 
    ] 
}</string> 

To jest mój jQuery Ajax wywołanie:

$.ajax({ 
    type: "GET", 
    //dataType: "json", <-- When I uncomment this line the request fails :(
    url: "http://webservices.domain.local/service.asmx/getData?name=", 

    success: function(data){ 
     console.log(data); // Output is: [object Document] instead of [object, object] 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown){ 

    } 
}); 

Jest to kod z mojego WebService:

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.Web; 
using System.Web.Script.Serialization; 
using System.Web.Script.Services; 
using System.Web.Services; 
using Newtonsoft.Json; 

namespace DataWebService 
{ 
    /// <summary> 
    /// Summary description for Service1 
    /// </summary> 
    [WebService(Namespace = "http://tempuri.org/")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    [System.ComponentModel.ToolboxItem(false)] 
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    [System.Web.Script.Services.ScriptService] 
    public class SPServices : System.Web.Services.WebService 
    { 
     [WebMethod] 
     [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] 
     public string getData(string name) 
     { 
      Account account = new Account 
      { 
       Email = "[email protected]", 
       Active = true, 
       CreatedDate = new DateTime(2013, 1, 20, 0, 0, 0, DateTimeKind.Utc), 
       Roles = new List<string> 
        { 
        "User", 
        "Admin" 
        } 
      }; 
      return JsonConvert.SerializeObject(account, Formatting.Indented); 
     } 
    } 

    public class Account 
    { 
     public string Email { get; set; } 
     public bool Active { get; set; } 
     public DateTime CreatedDate { get; set; } 
     public IList<string> Roles { get; set; } 
    } 
} 

Plik webconfig:

<?xml version="1.0"?> 
<configuration> 
    <configSections> 
     <!--<sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> 
     <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> 
      <section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> 
      <sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> 
      <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere" /> 
      <section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" /> 
      <section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" /> 
      <section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" /> 
      </sectionGroup> 
     </sectionGroup> 
     </sectionGroup>--> 
    </configSections> 
    <appSettings/> 
    <connectionStrings/> 
    <system.web> 
     <webServices> 
     <protocols> 
      <add name="HttpGet"/> 
      <add name="HttpPost"/> 
     </protocols> 
     </webServices> 
     <compilation debug="true" > 
      <assemblies> 
      <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> 
      <add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> 
      <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
      <add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> 
      </assemblies> 
     </compilation> 
    <!-- 
     The <authentication> section enables configuration 
     of the security authentication mode used by 
     ASP.NET to identify an incoming user. 
    --> 
    <authentication mode="Windows" /> 
    <!-- 
     The <customErrors> section enables configuration 
     of what to do if/when an unhandled error occurs 
     during the execution of a request. Specifically, 
     it enables developers to configure html error pages 
     to be displayed in place of a error stack trace. 

     <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm"> 
     <error statusCode="403" redirect="NoAccess.htm" /> 
     <error statusCode="404" redirect="FileNotFound.htm" /> 
     </customErrors> 
    --> 
     <pages> 
     <controls> 
      <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
      <add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     </controls> 
     </pages> 

     <httpHandlers> 
     <remove verb="*" path="*.asmx"/> 
     <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     <!--<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/>--> 
     </httpHandlers> 
     <httpModules> 
     <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     </httpModules> 
    </system.web> 
    <system.codedom> 
     <compilers> 
     <compiler language="c#;cs;csharp" extension=".cs" warningLevel="4" 
        type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
      <providerOption name="CompilerVersion" value="v3.5"/> 
      <providerOption name="WarnAsError" value="false"/> 
     </compiler> 
     </compilers> 
    </system.codedom> 
    <!-- 
     The system.webServer section is required for running ASP.NET AJAX under Internet 
     Information Services 7.0. It is not necessary for previous version of IIS. 
    --> 
    <system.webServer> 
     <validation validateIntegratedModeConfiguration="false"/> 
     <modules> 
     <remove name="ScriptModule" /> 
     <add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     </modules> 
     <handlers> 
     <remove name="WebServiceHandlerFactory-Integrated"/> 
     <remove name="ScriptHandlerFactory" /> 
     <remove name="ScriptHandlerFactoryAppServices" /> 
     <remove name="ScriptResource" /> 
     <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" 
      type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" 
      type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     <add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
     </handlers> 
     <httpProtocol> 
     <customHeaders> 
      <add name="Access-Control-Allow-Origin" value="*" /> 
      <add name="Access-Control-Allow-Headers" value="Content-Type" /> 
     </customHeaders> 
     </httpProtocol> 
    </system.webServer> 
    <runtime> 
     <assemblyBinding appliesTo="v2.0.50727" xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
      <assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/> 
      <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/> 
     </dependentAssembly> 
     <dependentAssembly> 
      <assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/> 
      <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/> 
     </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

byłbym naprawdę szczęśliwy, jeśli ktoś mógłby mi pomóc ... Spędziłem cały weekend w tym, ale nie mogłem znaleźć rozwiązanie dla tego ...: - (

+0

utworzyć XML zamiast JSON i AJAX przez domyślnie, jeśli treść jest xml to tworzymy dokument XML. – jcubic

+0

Dlaczego mam utworzyć XML z JSON? W mojej WebService zdefiniowałem, że zwróconą wartością powinien być JSON, a ja również próbowałem użyć biblioteki JSON ... Dowolny pomysł, jak mogę zmienić wyjście do JSON? – Simon

+0

Wygląda na to, że odpowiedź została już udzielona: http://stackoverflow.com/questions/5300855/how-can-my-asp-net-c-sharp-class-return--json-format –

Odpowiedz

1

Spróbuj użyć web-api ASP.net (część MVC 4) zamiast swojego podstawowego projektu. gdy działanie kontrolera zwróci obiekt, zostanie automatycznie przekształcony do pliku xml lub json w zależności od żądania. Taka przeglądarka wymaga zarówno jednej, jak i usługi.

Usunęli nawet starą bibliotekę MS dla JSON i zastąpili ją newtonsem. Oznacza to, że niektóre scenariusze są obsługiwane przez serializację json, a nie przez serializację XML. Jeśli potrzebujesz tych funkcji, możesz usunąć domyślny serializator XML i obsługiwać tylko json.

Powodzenia! :)

+0

mh ... Myślę, że tak naprawdę nie rozumiem, co masz na myśli ... może mógłbyś opisać to z nieco większą ilością szczegółów, aby uzyskać właściwy kierunek? (lub może niektóre linki?) – Simon

+0

Ma to na myśli: http://james.newtonking.com/pages/json-net.aspx –

+0

Mam na myśli przede wszystkim http://www.asp.net/web-api, który jest pierwsze trafienie w google dla asp.net web-api.Powinien ci powiedzieć wszystko, co musisz wiedzieć. Głównie myślę, że komplikujesz sobie wszystko, wybierając starszą, bardziej ogólną technologię, niż nowszą, bardziej usprawnioną. Więc wskazuję wam kierunek technologii, która powinna ułatwić wam życie. Jednak nie zrobię dla ciebie całej tej pracy. :) – Mithon

7

Dodaj następujący przy użyciu:

using System.Web.Mvc; 

i zmienić swoje methode do:

[WebMethod] 
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] 
public JsonResult getData(string name) 
     { 
      Account account = new Account 
      { 
       Email = "[email protected]", 
       Active = true, 
       CreatedDate = new DateTime(2013, 1, 20, 0, 0, 0, DateTimeKind.Utc), 
       Roles = new List<string> 
        { 
        "User", 
        "Admin" 
        } 
      }; 
      return Json(account); 
     } 

myślę, że będzie to działało tak jak tego

Powiązane problemy