如何将查询字符串与WCF服务一起使用?

时间:2015-09-23 23:38:02

标签: c# wcf query-string

我尝试创建网络服务,到目前为止他们工作得很好,但我遇到了一个问题:如果我的查询字符串没有按照确切的顺序排列,我将其指定为在,代码给我不正确的结果。

在开始一个大型项目之前,我希望能够传递一个查询字符串,这样订单就不重要了 - 传入"?user = foo& pass = bar"应该等同于"?pass = bar& user = foo",但我不确定如何按预期工作。

实际上,我不会因更改查询字符串参数而得到错误,而是DBAgent.authenticate()将按顺序接受参数,而不管查询字符串中的参数名称如何。

我错过了什么?

IDBAgent.cs:

public interface IDBAgent
{
    [OperationContract]
    [WebInvoke(UriTemplate = "/authenticate/?username={username}&password={password}", Method = "GET", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json)]
    string authenticate(string username, string password);
}

DBAgent.svc.cs

public class DBAgent : IDBAgent
{
    public string authenticate(string username, string password)
    {
        return runSQL("EXEC sp_Authenticate '" + username + "', '" + password + '\'');
    }
}

的index.html:

var output = "";
function callService(url, params)
{
    try {
        return $.ajax({
            type: "GET",
            async: false,
            url: url,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            processdata: true,
            success: function (msg) {
                output = msg;
            },
            error: function(){console.log("Oops.")}
        });
    }
    catch (e) {
        console.log("Something went wrong! (╯°□°)╯︵ ┻━┻");
    }
}

function authenticate(user, pass)
{
    callService("http://localhost/DBAgent.svc/authenticate/?username=foo&password=bar", []).done();    // Returns true
    console.log(output);
    callService("http://localhost/DBAgent.svc/authenticate/?password=bar&username=foo", []).done();    // Returns false
    console.log(output);
    callService("http://localhost/DBAgent.svc/authenticate/?password=foo&username=bar", []).done();    // Returns true
    console.log(output);
}

1 个答案:

答案 0 :(得分:1)

对于这种情况,您应该考虑使用' POST'而不是' GET'。此外,请注意,使用UriTemplate时,查询字符串参数的顺序并不重要。 ?用户= FOO&安培;传=栏"在结构上等同于"?pass = bar& user = foo",