Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Problems Passing Multiple Parameters to Web Service

Tags:

jquery

asp.net

I have a simple Web Service method defined as:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string MyWebMethod(string foo, string bar)
{
    // DataContractJsonSerializer to deserialize foo and bar to
    //  their respective FooClass and BarClass objects.

    return "{\"Message\":\"Everything is a-ok!\"}";
}

I'll call it from the client via:

var myParams = { "foo":{"name":"Bob Smith", "age":50},"bar":{"color":"blue","size":"large","quantity":2} };

$.ajax({
    type: 'POST',
    url: 'https://mydomain.com/WebServices/TestSvc.asmx/MyWebMethod',
    data: JSON.stringify(myParams),
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    success: function (response, status) {
        alert('Yay!');
    },
    error: function (xhr, err) {
        alert('Boo-urns!');
    }
});

However, this yields the following error (a breakpoint on the first line in MyWebMethod() is never hit):

{"Message":"No parameterless constructor defined for type of \u0027System.String\u0027.","StackTrace":" at System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary2 dictionary, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n at System.Web.Script.Services.WebServiceMethodData.StrongTypeParameters(IDictionary2 rawParams)\r\n at System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context, WebServiceMethodData methodData, IDictionary`2 rawParams)\r\n at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.MissingMethodException"}

I'd like to pass in two string parameters and use DataContractJsonSerializer to write new Foo and Bar objects. Am I missing something?

like image 206
Bullines Avatar asked Dec 16 '25 22:12

Bullines


1 Answers

For the code in the service, you need to use object instead of string for "foo" and "bar". And then use Newtonsoft.Json's function to parse convert this object to Json object and then build the strong typed object.

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string MyWebMethod(object foo, object bar)
{
    // DataContractJsonSerializer to deserialize foo and bar to
    //  their respective FooClass and BarClass objects.

    //parse object to JObject using NewtonJson
    JObject jsonFoo = JObject.Parse(JsonConvert.SerializeObject(foo));
    JObject jsonBar = JObject.Parse(JsonConvert.SerializeObject(bar));
    Foo fo = new Foo(jsonFoo);
    Bar ba = new Bar(jsonBar);

    return "{\"Message\":\"Everything is a-ok!\"}";
}
public class Foo{
    public Foo(JObject jsonFoo){
        if (json["prop1"] != null) prop1= json["prop1"].Value<long>();
        if (json["prop2"] != null) prop2= (string)json["prop2"];
        if (json["prop3"] != null) prop3= (string)json["prop3"];
    }
}
like image 89
Zhao Avatar answered Dec 19 '25 14:12

Zhao



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!