.Net Webservice не будет принимать параметры для вызова XML - PullRequest
0 голосов
/ 23 мая 2009

По какой-то причине моему веб-сервису не нравятся данные, которые я отправляю. Я продолжаю получать следующую ошибку:

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)
{
......
}

Ответы [ 5 ]

2 голосов
/ 23 мая 2009

Параметр data передает параметры в виде строки запроса (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
});
1 голос
/ 23 мая 2009

Вы на самом деле не отправляете данные XML на ваш веб-сервис. На данный момент, учитывая ваш пример кода, вы отправляете в стандартном HTML-кодированном формате:

field1=value1&field2=value2&field3=value3

Возможно, вам нужно изменить данные на XML, в соответствии с:

'<data><userName>' + userName + '</userName><pw>' + pw + '</pw></data>'

Чтобы выполнить последнее, вам также потребуется изменить сигнатуру веб-службы, чтобы она содержала одну строку, которая впоследствии десериализовалась:

[XmlRoot("data")]
public class UserRequestData
{
    public string userName { get; set; }
    public string pw { get; set; }
}

[WebMethod(EnableSession = true)]
[System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Xml)]
public DataTable loginUser(string xmlUserRequest)
{
    XmlSerializer serializer = new XmlSerializer(typeof(UserRequestData));
    StringReader reader = new StringReader(xmlUserRequest);
    UserRequestData data = serializer.Deserialize(reader);

    string userNme = data.UserName;
    string pw = data.Pw;
......
}

Вероятно, также важно отметить, что атрибут, которым вы украсили свой метод обслуживания:

[System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Xml)]

Имеет отношение к возвращаемому значению метода обслуживания, а не к входным данным. Украсив этим, ваш ОТВЕТ будет отформатирован с xml. Это не влияет на вход в ваш сервис.

Надеюсь, это поможет.

1 голос
/ 23 мая 2009

Предлагаю попробовать soapUI . Используйте его для отправки запроса и просмотра ответа. Посмотрите, как выглядит запрос, который отправляет soapUI. Затем попробуйте отправить то же самое.

0 голосов
/ 01 июня 2012

Попробуйте это:

contentType: "text/xml; charset=\"utf-8\"",
0 голосов
/ 23 мая 2009

Если вы хотите вернуть сериализованные объекты .Net через JSON, вам нужно сделать несколько вещей. Предполагая, что вы используете вызовы jQuery ajax, он должен просто работать (после внесения изменений в ваш сервис, упомянутый ниже), учитывая, что jQuery добавляет параметр обратного вызова для вас. Если вы не используете jQuery, просто добавьте параметр обратного вызова самостоятельно, указывая на любую функцию js, которую вы хотели бы вызвать в случае успеха.

  • Украсьте свой операционный контракт настройкой ResponseFormat.WebMessageForm.Json (например, [WebGet(BodyStyle = WebMessageBodyStyle.WrappedRequest,ResponseFormat = WebMessageFormat.Json,RequestFormat = WebMessageFormat.Json)])
  • создать класс, который наследуется от Stream (см. Ниже):

    public class JSONCallbackStream : Stream
    

    { приватный поток _stream;

    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
    

    { public void Dispose () {}

    //looks for a callback parameter, if found it wraps the return in the callback string
    public void Init(HttpApplication app)
    {
        app.BeginRequest += delegate
        {
            HttpContext ctx = HttpContext.Current;
    
            if ((ctx.Request.RequestType.ToUpper() == "GET"))
            {
                string[] parameters = ctx.Request.QueryString.GetValues("callback");
    
                if (parameters != null && parameters.Length == 1)
                {
                    JSONCallbackStream _captureStream = new JSONCallbackStream(ctx.Response.Filter);
                    _captureStream.CallbackFunction = parameters[0];
    
                    ctx.Response.Filter = _captureStream;
                }
            }
        };
    
    }
    

    }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...