首页 > 解决方案 > 从 AJAX 调用 Web 服务时,没有为此对象定义无参数构造函数

问题描述

我想使用 AJAX 从 JScript 调用我的 Web 服务,但发现了错误。

错误是:

{消息:“没有为'System.String'类型定义无参数构造函数。”,...} ExceptionType:“System.MissingMethodException”消息:“没有为'System.String'类型定义无参数构造函数。” StackTrace:“在 System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary 2 dictionary, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) ↵ at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) ↵ at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) ↵ at System.Web.Script.Services.WebServiceMethodData.StrongTypeParameters(IDictionary2 rawParams) ↵ 在 System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context, WebServiceMethodData methodData, IDictionary`2 rawParams) ↵ 在 System.Web .Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)"

这是我的 AJAX

function retrieveToken(){var BodyToken = JSON.stringify({
    "userName": "crm"
});
var param1= {
    Token : BodyToken
}

var param2 = JSON.stringify({
    param1
});
$.ajax({
    url: "http://10.23.64.43:8035/iFrameIntegration.asmx/getToken?",
    data: "Token="+JSON.stringify({"userName":"crm"}),
    contentType: "application/json; charset=utf-8",
    type: 'GET',
    success: function (data) {
        alert(data);
    },
    error: function (data) {
        alert("Error");
    }
});}

这是我的网络服务

public class iFrameIntegration : System.Web.Services.WebService
{

    [WebMethod]
    [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
    public void getToken(string Token)
    {
        var request = (HttpWebRequest)WebRequest.Create("http://10.23.64.37:8080/ACCMWS/member/SSOInit");
        var DataObject = Token;
        var data = Encoding.ASCII.GetBytes(DataObject);
        request.Method = "POST";
        request.ContentType = "application/json";
        //request.Headers["Content-Type"] = "application/json";
        request.Headers["userId"] = "Svc_CRM";
        request.Headers["loginType"] = "Internal";
        request.Headers["token"] = "54a93982adf51adfb81885ddbbb1874e271605ce";

        try
        {
            request.ContentLength = data.Length;
            Stream dataStream = request.GetRequestStream();
            dataStream.Write(data, 0, data.Length);
            dataStream.Close();
            WebResponse response = request.GetResponse();
            Stream resultStream = response.GetResponseStream();

            StreamReader reader = new StreamReader(resultStream);
            string readerResponse = reader.ReadToEnd();
            var result = JsonConvert.DeserializeObject<RetrieveSSOTokenResult>(readerResponse);
            //return result.data.ssotokenList[0].ssoToken;
            PrintValue(result.data.ssotokenList[0].ssoToken);
        }
        catch(Exception ex)
        {
            ex.Message.ToString();
        }

    }

    private void PrintValue(object obj)
    {
        Context.Response.Write(obj.ToString());
    }
}}

这也是我的课

namespace FWDiFrameIntegration{
public class RetrieveSSOTokenResult
{
    public string status { get; set; }
    public string message { get; set; }
    public Data data { get; set; }
}

public class Data
{
    public Ssotokenlist[] ssotokenList { get; set; }
}

public class Ssotokenlist
{
    public string loginType { get; set; }
    public string userName { get; set; }
    public string userId { get; set; }
    public string ssoToken { get; set; }
    public long expiryTime { get; set; }
}}

请指教

更新。

最后,能够根据 Gaurav 信息解决。错误来了,因为我使用的是公共无效。这是我的更新网络服务

[WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string getToken()
    {
        var request = (HttpWebRequest)WebRequest.Create("http://10.23.64.37:8080/ACCMWS/member/SSOInit");
        request.Method = "POST";
        request.ContentType = "application/json";
        request.Headers["userId"] = "Svc_CRM";
        request.Headers["loginType"] = "Internal";
        request.Headers["token"] = "54a93982adf51adfb81885ddbbb1874e271605ce";

        string result = string.Empty;
        try
        {
            using (var streamWriter = new StreamWriter(request.GetRequestStream()))
            {
                string json = "{ \"userName\": \"crm\"}";
                streamWriter.Write(json);
                streamWriter.Flush();
                streamWriter.Close();
            }
            try
            {
                using (var response = request.GetResponse() as HttpWebResponse)
                {
                    if (request.HaveResponse && response != null)
                    {
                        using (var reader = new StreamReader(response.GetResponseStream()))
                        {
                            var resultTokenAwal = reader.ReadToEnd();
                            var resultToken = JsonConvert.DeserializeObject<RetrieveSSOTokenResult>(resultTokenAwal);
                            result = resultToken.data.ssotokenList[0].ssoToken;
                        }
                    }
                }
            }
            catch (WebException e)
            {
                if (e.Response != null)
                {
                    using (var errorResponse = (HttpWebResponse)e.Response)
                    {
                        using (var reader = new StreamReader(errorResponse.GetResponseStream()))
                        {
                            string error = reader.ReadToEnd();
                            result = error;
                        }
                    }

                }
            }
        }
        catch(Exception ex)
        {
            ex.Message.ToString();
        }
        return result;
    }

标签: javascriptc#

解决方案


好的,经过少量研究后,我终于通过将方法动词更改为 POST 而不是 GET 来实现它,因为我们不能(或变得太复杂)在 GET 请求中发送复杂的数据类型。这是代码:

 [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public void getToken(object Token)
    {

    }

这是ajax代码:

$.ajax({
            url: "/iFrameIntegration.asmx/getToken",
            data: JSON.stringify({ Token: { userData: 'crm' } }),
            contentType: "application/json; charset=utf-8",
            type: 'POST',
            success: function (data) {
                alert(data);
            },
            error: function (data) {
                alert("Error");
            }
        });

推荐阅读