.NETWebService赢得';不接受XML调用的参数
由于某些原因,我的Web服务不喜欢我发送的数据。我不断得到以下错误:.NETWebService赢得';不接受XML调用的参数,.net,jquery,xml,ajax,web-services,.net,Jquery,Xml,Ajax,Web Services,由于某些原因,我的Web服务不喜欢我发送的数据。我不断得到以下错误: System.InvalidOperationException: Request format is invalid: text/xml; charset=utf-8. 在System.Web.Services.Protocols.HttpServerProtocol.ReadParameters()中 在System.Web.Services.Protocols.WebServiceHandler.CoreProcess
System.InvalidOperationException: Request format is invalid: text/xml; charset=utf-8.
在System.Web.Services.Protocols.HttpServerProtocol.ReadParameters()中
在System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()中
有什么想法吗
这是我的密码:
$.ajax({
type: "POST",
url: "/wsCheckout.asmx/loginUser",
data: "userName=" + userName + "&pw=" + pw,
contentType: "text/xml; charset=utf-8",
dataType: "xml",
cache: false,
beforeSend: function(n){ showLoading(); },
complete: function(n){ hideLoading(); },
success: function(r) {
if( checkResponse(r) == true ){
closeBox(aspxIdPrefix + "login");
hideBox(aspxIdPrefix + "login");
openBox("#shippingAddress");
}
} // end success
}); //end AJAX
[WebMethod(EnableSession = true)]
[System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Xml)]
public DataTable loginUser(string userName, string pw)
{
......
}
我建议你试试。使用它发送请求,并观察响应。查看soapUI发送的请求的外观。然后试着发送同样的邮件。我建议你试试。使用它发送请求,并观察响应。查看soapUI发送的请求的外观。然后尝试发送相同的内容。数据选项以querystring(GET)而不是post的形式传递参数,并且内容类型需要是application/json。下面是完整的语法
$.ajax({
type: "POST",
url: "/wsCheckout.asmx/loginUser",
data: "{userName:'" + userName + "',pw:'" + pw+"'}",
contentType: "application/json; charset=utf-8",
dataType: "xml",
cache: false,
beforeSend: function(n){ showLoading(); },
complete: function(n){ hideLoading(); },
success: function(r) {
if( checkResponse(r) == true ){
closeBox(aspxIdPrefix + "login");
hideBox(aspxIdPrefix + "login");
openBox("#shippingAddress");
}
} // end success
});
data选项将参数作为querystring(GET)而不是post传递,并且内容类型需要是application/json。下面是完整的语法
$.ajax({
type: "POST",
url: "/wsCheckout.asmx/loginUser",
data: "{userName:'" + userName + "',pw:'" + pw+"'}",
contentType: "application/json; charset=utf-8",
dataType: "xml",
cache: false,
beforeSend: function(n){ showLoading(); },
complete: function(n){ hideLoading(); },
success: function(r) {
if( checkResponse(r) == true ){
closeBox(aspxIdPrefix + "login");
hideBox(aspxIdPrefix + "login");
openBox("#shippingAddress");
}
} // end success
});
如果您想通过JSON返回序列化的.Net对象,您需要做一些事情。假设您使用的是jqueryajax调用(在对下面提到的服务进行更改之后),假设jQuery为您附加了回调参数,那么它应该可以正常工作。如果不使用jQuery,只需自己附加回调参数,指向希望在成功时调用的js函数
- 设置ResponseFormat.WebMessageForm.Json来修饰您的操作合同
(例如,
)[WebGet(BodyStyle=WebMessageBodyStyle.WrappedRequest,ResponseFormat=WebMessageFormat.Json,RequestFormat=WebMessageFormat.Json)]
- 创建从流继承的类(请参见下文):
{
私有流(u流),
}private string _callbackFunction = string.Empty; public JSONCallbackStream(Stream stream) { _stream = stream; } public override bool CanRead { get { return _stream.CanRead; } } public override bool CanSeek { get { return _stream.CanSeek; } } public override bool CanWrite { get { return _stream.CanWrite; } } public override long Length { get { return _stream.Length; } } public override long Position { get { return _stream.Position; } set { _stream.Position = value; } } public string CallbackFunction { get { return _callbackFunction; } set { _callbackFunction = value; } } public override void Flush() { _stream.Flush(); } public override int Read(byte[] buffer, int offset, int count) { return _stream.Read(buffer, offset, count); } public override long Seek(long offset, SeekOrigin origin) { return _stream.Seek(offset, origin); } public override void SetLength(long value) { _stream.SetLength(value); } public override void Write(byte[] buffer, int offset, int count) { if (CallbackFunction != string.Empty) { // This MUST be a one-time write to the underlying stream - any more than 1 write means // that the stream will be truncated/an exception could be thrown string content = CallbackFunction + "(" + Encoding.UTF8.GetString(buffer) + ");"; byte[] contentBytes = Encoding.UTF8.GetBytes(content); _stream.Write(contentBytes, 0, Encoding.UTF8.GetMaxCharCount(contentBytes.Length)); } else { _stream.Write(buffer, offset, count); } }
- 创建一个从IHttpModule继承的类,并确保在web.config中system.web->httpModules(以及system.webServer->modules,如果在IIS 7上)下有相应的条目,请参见下面的类:
{ 公共空间处置() {} }public class JSONCallback : IHttpModule
- 设置ResponseFormat.WebMessageForm.Json来修饰您的操作合同
(例如,
)[WebGet(BodyStyle=WebMessageBodyStyle.WrappedRequest,ResponseFormat=WebMessageFormat.Json,RequestFormat=WebMessageFormat.Json)]
- 创建从流继承的类(请参见下文):
{
私有流(u流),
}private string _callbackFunction = string.Empty; public JSONCallbackStream(Stream stream) { _stream = stream; } public override bool CanRead { get { return _stream.CanRead; } } public override bool CanSeek { get { return _stream.CanSeek; } } public override bool CanWrite { get { return _stream.CanWrite; } } public override long Length { get { return _stream.Length; } } public override long Position { get { return _stream.Position; } set { _stream.Position = value; } } public string CallbackFunction { get { return _callbackFunction; } set { _callbackFunction = value; } } public override void Flush() { _stream.Flush(); } public override int Read(byte[] buffer, int offset, int count) { return _stream.Read(buffer, offset, count); } public override long Seek(long offset, SeekOrigin origin) { return _stream.Seek(offset, origin); } public override void SetLength(long value) { _stream.SetLength(value); } public override void Write(byte[] buffer, int offset, int count) { if (CallbackFunction != string.Empty) { // This MUST be a one-time write to the underlying stream - any more than 1 write means // that the stream will be truncated/an exception could be thrown string content = CallbackFunction + "(" + Encoding.UTF8.GetString(buffer) + ");"; byte[] contentBytes = Encoding.UTF8.GetBytes(content); _stream.Write(contentBytes, 0, Encoding.UTF8.GetMaxCharCount(contentBytes.Length)); } else { _stream.Write(buffer, offset, count); } }
- 创建一个从IHttpModule继承的类,并确保在web.config中system.web->httpModules(以及system.webServer->modules,如果在IIS 7上)下有相应的条目,请参见下面的类:
{ 公共空间处置() {} }public class JSONCallback : IHttpModule
field1=value1&field2=value2&field3=value3
您可能需要按照以下步骤将数据更改为xml:
'<data><userName>' + userName + '</userName><pw>' + pw + '</pw></data>'
可能还需要注意的是,您用以下属性修饰服务方法:
[System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Xml)]
与服务方法的返回值有关,而不是与输入数据有关。通过对其进行修饰,您的响应将被格式化为xml。这不会影响对服务的输入
希望这能有所帮助。您实际上并没有向web服务发送XML数据。目前,给出您的示例代码片段,您将以标准HTML表单编码格式发送:
field1=value1&field2=value2&field3=value3
您可能需要按照以下步骤将数据更改为xml:
'<data><userName>' + userName + '</userName><pw>' + pw + '</pw></data>'
可能还需要注意的是,您用以下属性修饰服务方法:
[System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Xml)]
与服务方法的返回值有关,而不是与输入数据有关。通过对其进行修饰,您的响应将被格式化为xml。这不会影响对服务的输入
希望这有帮助。试试这个:
contentType: "text/xml; charset=\"utf-8\"",
试试这个:
contentType: "text/xml; charset=\"utf-8\"",
您的Web服务是否接受xml形式的输入?为什么需要在上面设置contentType参数?这是我的猜测。您正在将contentType设置为xml,但数据不是xml格式。您的Web服务是否接受xml格式的输入?为什么需要在上面设置contentType参数?这是我的猜测。您正在将contentType设置为xml,但数据不是xml格式。问题是我希望返回xml格式的响应。我会使用JSON,但我很难找回正确的序列化.Net对象。只需将参数“dataType”更改为“xml”。请尝试上面更新的脚本。问题是我想要一个xml回复。我会使用JSON,但我很难找回正确的序列化.Net对象。只需将参数“dataType”更改为“xml”。请尝试上面更新的脚本。您的解决方案是否可以将数据表序列化为JSON?这是我的主要问题。我试图实现其他人的建议,但尚未得到预期的结果。上面的代码用于.NET2.0WCF服务。至于序列化数据表,您可能需要稍微处理一下。我猜DataSet的GetXML()方法将帮助您实现目标。您的解决方案是否可以将数据表序列化为JSON?这是我的主要问题。我试图实现其他人的建议,但尚未得到预期的结果。上面的代码用于.NET2.0WCF服务。至于序列化数据表,您可能需要稍微处理一下。我猜DataSet的GetXML()方法将帮助您实现目标。这很有帮助。特别是最后一部分。谢谢,那很有帮助。特别是最后一部分。谢谢