使用http post调用restful wcf服务时出现http 400错误

时间:2009-08-24 22:00:57

标签: wcf rest post

我已经设置了wcf服务。不幸的是,当我通过提琴手,网络或其他人调用服务时,我收到了一个http 400错误。我真的很困惑在哪里开始解决这个问题。任何建议表示赞赏。 WSDL目前不是一个选项。 REST是一项要求。我以前可以使用GET进行调用,但是,get不安全,因为我需要传递用户ID和密码来验证,这很容易查看。

wcf服务具有以下界面:

    [WebInvoke(UriTemplate = "/Login", Method="POST", 
        ResponseFormat = WebMessageFormat.Xml, 
        BodyStyle = WebMessageBodyStyle.Wrapped)]
    [OperationContract]
    bool Login(string UserName, string PassWord, string AppKey);

该服务具有以下代码。是的,这段代码是不完整的,我知道AppKey确实没有做任何事情,它在这里作为占位符。

    public bool Login(string UserName, string PassWord, string AppKey)
    {
        bool bl = false;
        if (String.IsNullOrEmpty(AppKey))
        {
            throw (new ApplicationException(AppKeyNull));
        }
        if (Membership.ValidateUser(UserName, PassWord))
        {
            bl = true;
        }
        return (bl);
    }

我试图通过提琴手调用该服务。我有以下网址:

http://127.0.0.1:82/WebServices/RemoteAPI.svc/Login

我有以下标题设置:

User-Agent: Fiddler
Host: 127.0.0.1:82
Content-Length: 46
Content-Type: application/x-www-form-urlencoded

我有以下身体设置:

UserName=xxxxxx&PassWord=yyyyyy&AppKey=blah

5 个答案:

答案 0 :(得分:2)

尝试一下:

将方法签名和属性更改为此

[WebInvoke(UriTemplate = "/Login", Method = "POST", ResponseFormat = WebMessageFormat.Xml, RequestFormat= WebMessageFormat.Xml)]
[OperationContract]
bool Login(LoginContract loginInfo);

然后添加一个新的数据合同LoginContract

[DataContract]
public class LoginContract
{
    [DataMember]
    public string UserName { get; set; }

    [DataMember]
    public string PassWord { get; set; }

    [DataMember]
    public string AppKey { get; set; }

}

然后当你用Fiddler发帖时指定Content-Type: text/xml

并将其用作您的请求正文

<LoginContract xmlns="http://schemas.datacontract.org/2004/07/YourAppName" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<AppKey>blah</AppKey>
<PassWord>testpwd</PassWord>
<UserName>test</UserName></LoginContract>

或者,如果您想使用JSON作为请求正文,请更改RequestFormat = WebMessageFormat.JSON并将其作为您的请求正文传递

{ "AppKey": "blah", "PassWord": "testpwd", "UserName": "test" }

答案 1 :(得分:0)

如果由于某种原因你自己计算了内容长度,那么可能会发生400错误。可能需要更多信息,例如http请求的全文。

答案 2 :(得分:0)

这是一种传递给REST服务的有效数据格式吗?

我只能假设你正在使用它: http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webinvokeattribute.aspx

并且您没有指定支持XML和JSON的RequestFormat。你的身体既不是JSON也不是XML。

答案 3 :(得分:0)

查看WCF REST Contrib以获取相关帮助。或者您可以在实现方法中接受Stream参数,并使用HttpUtility.ParseQueryString实用程序从POSTed正文中解析出查询字符串值。

答案 4 :(得分:0)

User-Agent: Fiddler
Host: localhost:8889
Content-Length: 113
**Content-Type: text/xml**

检查请求标头中是否缺少“Content-Type”?