Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NETWebService赢得';不接受XML调用的参数_.net_Jquery_Xml_Ajax_Web Services - Fatal编程技术网

.NETWebService赢得';不接受XML调用的参数

.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

由于某些原因,我的Web服务不喜欢我发送的数据。我不断得到以下错误:

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
    
    { 公共空间处置() {}

    }


如果您想通过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
    
    { 公共空间处置() {}

    }


您实际上并没有向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。这不会影响对服务的输入


希望这能有所帮助。

您实际上并没有向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()方法将帮助您实现目标。这很有帮助。特别是最后一部分。谢谢,那很有帮助。特别是最后一部分。谢谢