【问题标题】:Sending array as parameters using POST method in senchatouch2在 senchatouch2 中使用 POST 方法将数组作为参数发送
【发布时间】:2013-04-07 10:25:10
【问题描述】:

使用此服务,我想使用 senchatouch2 中的 POST 方法将数组值存储到数据库中。服务是用 (WCF) 编写的

服务声明:

[OperationContract]
[WebInvoke(Method = "POST", 
           ResponseFormat = WebMessageFormat.Json,
           RequestFormat = WebMessageFormat.Json,
           BodyStyle = WebMessageBodyStyle.Wrapped,
           UriTemplate = "/Check1")]
int Psngr(string[] FirstName);

服务定义:

public static int Psngr(string[] FirstName)
{  
    List<Psgr> psgr = new List<Psgr>();
    var getVal = from s in FirstName select s;
    int count = getVal.Count();

    SqlConnection con = new SqlConnection(WebConfigurationManager.ConnectionStrings["db"].ToString());
    con.Open();

    using (var cmd = new SqlCommand("SP_InsertCheck1", con))
    {
        int result;
        cmd.CommandType = CommandType.StoredProcedure;

        for (int i = 0; i < count; i++)
        {
            cmd.Parameters.Clear();
            cmd.Parameters.AddWithValue("@FirstName", FirstName[i]);

            using (var Da = new SqlDataAdapter(cmd))
            using (var Ds = new DataSet())
            {
                Da.Fill(Ds);
                result = Convert.ToInt16(Ds.Tables[0].Rows[0]["Result"].ToString());
            }
        }
        return 1;
    }
}

我通过我的 ajax 请求访问了这个服务,如下所示:

Ext.Ajax.request({
    url:'http://ws.easy4booking.com/E4b.svc/Check1',                                                   
    method:'POST',                                            
    disableCaching: false,                                          
    headers: {
       'Accept': 'application/json',
       'Content-Type': 'application/json'
    },
    params: {
        FirstName:fname_toString,  //FirstName:["Sam","Paul"],
},
    success:function(response) {
        console.log(response);
    }
});

当我访问上面提到的这个服务时,我得到了以下错误

请求错误:

服务器在处理请求时遇到错误。异常消息是'格式化程序在尝试反序列化消息时抛出异常:反序列化操作'Psngr'的请求消息正文时出错。遇到意外的字符“F”。有关更多详细信息,请参阅服务器日志。异常堆栈跟踪是:

在 System.ServiceModel.Dispatcher.OperationFormatter.DeserializeRequest(Message message, Object[] 参数) at System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest(消息消息,对象 [] 参数)在 System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest(消息消息,对象 [] 参数)在 System.ServiceModel.Dispatcher.CompositeDispatchFormatter.DeserializeRequest(消息消息,对象 [] 参数)在 System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

【问题讨论】:

  • 我会说你监控原始请求的样子。使用 Fiddler 或 WireShark 等工具查看原始请求。您还可以在 WCF 服务上启用跟踪并查看导致问题的原因。
  • 我不明白问题出在哪里……sencha 代码或服务中的问题?请回复我
  • 启用 wcf 跟踪,使用 svcTraceViewer.exe 查看它们 IMO - 这将有助于找到错误的来源。
  • 另外,你确定你发送的是数组而不是字符串吗?
  • 是的,我确定 m 发送 ARRAY oly ..my 数组传递 lik FirstName:["Annie","Dev","Anish","Angel"]

标签: arrays wcf post parameters


【解决方案1】:

当v在SenchaTouch2中使用POST方式传递参数时,在Ajax Request中使用jsonData

Ext.Ajax.request({ 网址:'', 方法:'POST', 禁用缓存:假, 标题:{ '接受':'应用程序/json', “内容类型”:“应用程序/json” }, jsonData:{ FirstName:fname //{"FirstName":["Sam","paul"]} }, 成功:功能(响应) { console.log(response.responseText); }, 失败:功能(响应) { console.log(response.responseText); }, });

【讨论】:

    【解决方案2】:

    当您的客户端向 WCF Rest 服务发出请求时,原始请求应如下所示:

    POST http://localhost/SampleService/RestService/Check1 HTTP/1.1
    User-Agent: Fiddler
    Content-Type: application/json
    Host: localhost
    Content-Length: 33
    
    {"FirstName":["Sam","paul"]}
    

    似乎您的 sencha 代码正在传递 WCF 无法反序列化的字符串 []。您可能会考虑将其作为 jsonData 而不是参数传递。

    还可以看看这个link,这可能会有所帮助。(他们尝试使用的服务在 Spring MVC 中,但我想 WCF 服务也应该是一样的)

    【讨论】:

    • 我将参数更改为 jsonData,现在可以正常工作了。非常感谢 4 位您的回复
    • 对于 GET 方法我们应该使用 params 而对于 POST 方法我们应该使用 jsonData 吧?
    • @Annie:如果您可以将其标记为答案会很好,以便对遇到相同问题的人有所帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多