ASP.NET JSON web service always return the JSON response wrapped in XML

后端 未结 9 1325
清歌不尽
清歌不尽 2020-12-05 20:17

I saw a similar question but it did not resolve my issue. I have a JSON web service in an ASMX file;

The code for the web method

        [WebMethod]         


        
相关标签:
9条回答
  • 2020-12-05 20:47

    The WebMethod is able to serve the same information both as XML and JSON. You need to specify what format you want (dataType) in the client, as you submit your request.

    Also, you're not supposed to serialize the object to JSON manually, but rather, return roles, and it will be serialized to JSON if your client requests the data as JSON.

    EDIT

    jQuery example (note the dataType parameter):

    $.ajax({
       type: 'GET',
       url: 'http://dev.formshare.gologictech.com/JSON/JSONService.asmx/GetUserRoles',
       contentType: 'application/json; charset=utf-8',
       dataType: 'json',
       data: '{"JSONUserCode":"1234"}',
       success: myCallback
    });
    

    It is worth mentioning that the object will not be returned in exactly the format you specified, but rather, wrapped in an object:

    { d: [ {"Name":"Accounts Payable"}, {"Name":"Payroll"} ] }
    

    This, however, is actually quite desirable, for added security

    0 讨论(0)
  • 2020-12-05 20:48

    Your missed only "static" keyword in method declaration please look into the following it should work.

    FYI: All the web methods should be static

    [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)]

        public static string GetUserRoles(string JSONUserCode)
        {
            string retRoles = string.Empty;
            List<JSONRole> roles = new List<JSONRole>();
    
            {... I Populate the roles here ...}
    
            DataContractJsonSerializer serializer = new
            DataContractJsonSerializer(roles.GetType());
            MemoryStream ms = new MemoryStream();
            serializer.WriteObject(ms, roles);
            string jsonString = Encoding.Default.GetString(ms.ToArray());
            ms.Close();
            return jsonString;
        }
    
    0 讨论(0)
  • 2020-12-05 20:49

    Turns out it's not dataType that counts but

    contentType: 'application/json; charset=utf-8'.  
    

    It worked like a charm.

    0 讨论(0)
  • 2020-12-05 20:51

    Make sure your service class has [ScriptService] attribute. This attribute is not added by default.

    0 讨论(0)
  • 2020-12-05 20:53

    Instead of returning a string in your WebMethod use:

    JavaScriptSerializer js = new JavaScriptSerializer();
    Context.Response.Write(js.Serialize(YOUR_STRING_TO_OUTPUT));
    
    0 讨论(0)
  • 2020-12-05 20:59

    I made the same mistake by handling the serialization myself. You re not supposed to return string but the object itself.

    If you have already developed a hundred Services like this, a work around for you: just created a aspx, ServiceCaller.aspx, remove everything in the html just leave the page directive and use the codebehind to call the service and Response.Write the string. Also take the Service method name as a parameter like "HelloWorld" and use reflection to invoke it.

    It's kinda showing your left ear with your right hand but it works. You can also easily integrate a roles management and using reflection get the service name as string check the db if the user can call this service and with reflection Invoke the method.

    (any comments on this is welcome :)

    0 讨论(0)
提交回复
热议问题