0

好的,对于更了解这类事情的人来说,这应该很容易。我将限制我提供的代码的范围,因为这适用于一种变体(提琴手)。

这个问题很容易解释:我在 WCF 中有一个将字符串作为参数的方法。该方法需要一个带有包裹体样式的请求。如果我在提琴手中创建一个简单的对象并将其发送过来,它就可以工作。像 {"submission":"something"} 这样的东西。如果我通过 JSON 中的 ajax 执行此操作,则它不起作用。我收到一个错误的请求错误,说它是不允许的……这是跨域的,但这不是问题,我在方法中添加了适当的标头来处理这个问题。在这种情况下,永远不会调用该方法(就像签名有问题一样)。

事情是这样的……如果我用一个字符串的一个属性创建一个非常简单的类并传入一个对象,它就可以正常工作。以包裹的主体样式传递对象可以正常工作。尝试使用诸如字符串之类的“原始类型”来执行此操作不会……有任何想法吗?

这不起作用(但确实通过提琴手起作用)....

        var datain = new Object();
        datain.submission = "mysubmission";

        var dataToSend2 = JSON.stringify(datain);

                    $.ajax({
                        type: "POST",
                        url: "http://localhost:8000/ServiceModelSamples/Service/rest/Reflect",
                        contentType: "application/json; charset=utf-8",
                        dataType: "json",
                        data: dataToSend2,
                        success: function (item) {
                            debugger;
                            alert(item);
                        },
                        error: function (xhr) {
                            debugger;
                            alert(xhr);
                        }
                    });

有了这份合同......

        [OperationContract]
    [WebInvoke(Method = "*", 
        RequestFormat = WebMessageFormat.Json,
        BodyStyle=WebMessageBodyStyle.WrappedRequest)]
    string Reflect(String submission);

这确实有效....

            var spec = new Object();
        spec.submission = "mysubmission";

        var dataToSend3 = '{"thespecial":' + JSON.stringify(spec) + '}';

        $.ajax({
            type: "POST",
            url: "http://localhost:8000/ServiceModelSamples/Service/rest/Reflecting",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            data: dataToSend3,
            success: function (item) {
                debugger;
                alert(item);
            },
            error: function (xhr) {
                debugger;
                alert(xhr);
            }
        });

有了这份合同...

        [OperationContract]
    [WebInvoke(Method = "*",
        RequestFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    string Reflecting(Special thespecial);
4

1 回答 1

0

是的,如果不包装在 xml 中,您将无法发送原始数据类型。

您可以在端点行为中启用帮助后检查完整的请求结构

假设您有 webHttpBinding 的端点名称“api”,那么您可以使用以下方法启用帮助

    < webHttp helpEnabled = "true " />

配置完成后可以看到如下帮助

  http://localhost:<port>/test.svc/api/help

这将显示实际的请求格式。

喜欢传递字符串可以使用以下格式包装器

  <string xmlns="http://schemas.microsoft.com/2003/10/ 
 Serialization/">Hello World</string> 

或者您可以使用流输入参数

点击 这里实现流式传输

于 2013-04-12T18:18:16.303 回答