javascript - 从 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(IDictionary
2 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;
}
解决方案
好的,经过少量研究后,我终于通过将方法动词更改为 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");
}
});
推荐阅读
- javascript - 在 Chrome 扩展程序中,当页面需要一段时间时,如何在页面加载后运行脚本?
- django - 将数据从一个表链接到另一个由中间表连接的表
- scala - 如何在控制台中与我的播放应用程序交互?
- php - PHP CSRF 令牌脚本阻止我表单上的提交按钮
- javascript - 表中的 JQuery 选择器
- firebase - React Native Firebase,equalTo()被错误地应用了吗?
- c# - 如何将多个 LINQ Include() 语句分配给一个变量以供代码重用?
- json - Spring Boot Ajax 解析错误 - 无法将对象返回到 ajax 成功 fn
- linux - 查找进程启动时间“/proc/pid”创建时间或“ps ef”命令哪个更可靠
- python - 删除列索引pandas python