2013-08-11 9 views
5

Ho creato un C# ASP.Net JSON WebService. Ma ho grossi problemi con la lettura dei dati da questo WebService perché ai miei occhi l'output non è un formato JSON valido?Come creare un JSON WebService in C# ASP.Net con un output JSON valido e una query con JQuery/Ajax

Normalmente si dovrebbe restituire [oggetto, oggetto] come dati. Ma ottengo [oggetto, documento] Cosa sto facendo male o cosa mi manca?

La mia uscita di corrente è simile al seguente:

<?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> 

Questo è il mio invito JQuery-Ajax:

$.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){ 

    } 
}); 

Questo è il codice dal mio 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; } 
    } 
} 

Il file 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> 

Sarei davvero felice se qualcuno mi potrebbe aiutare ... Ho passato tutto il weekend in questo, ma non ho potuto trovare una soluzione per questo ...: - (

+0

Si crea XML invece di JSON e Ajax per predefinito se il contenuto è xml crea un documento xml. – jcubic

+0

Perché creo XML insted di JSON? Nel mio WebService ho definito che il valore restituito dovrebbe essere JSON e ho anche provato ad usare una libreria JSON ... Qualche idea su come posso cambiare l'output in JSON? – Simon

+0

Sembra che questo è stato risposto prima: http://stackoverflow.com/questions/5300855/how-can-my-asp-net-c-sharp-class-return-a-json-format –

risposta

1

Provare a utilizzare il web-api ASP.net (parte di MVC 4) come progetto principale. quando un'azione del controllore restituisce un oggetto, verrà serializzato automaticamente su xml o json a seconda della richiesta. Questo è il tuo browser richiede uno e il servizio fornisce.

Hanno persino estratto la vecchia libreria MS per JSON e l'hanno sostituita con quella newtonsoft. Ciò significa che alcuni scenari sono supportati dalla serializzazione json e non dalla serializzazione xml. Se hai bisogno di queste funzionalità, puoi rimuovere il serializzatore xml predefinito e supportare solo json.

Buona fortuna! :)

+0

mh ... Penso di non capire veramente cosa intendi ... forse potresti descriverlo con un po 'più di dettagli in modo da ottenere la giusta direzione? (o forse alcuni link?) – Simon

+0

Intende questo: http://james.newtonking.com/pages/json-net.aspx –

+0

Intendo principalmente http://www.asp.net/web-api, che è il prima volta su google per asp.net web-api.Dovrebbe dirti tutto quello che devi sapere. Principalmente sto pensando che stai complicando le cose da solo scegliendo una tecnologia più generale più vecchia rispetto a una più moderna. Quindi ti indico nella direzione di una tecnologia che dovrebbe semplificarti la vita. Comunque non ho intenzione di fare tutto il lavoro per te. :) – Mithon

7

Aggiungere il seguente utilizzando:

using System.Web.Mvc; 

e cambiare il tuo Methode a:

[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); 
     } 

penso che funzionerà come questo