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

使用http post调用restful wcf服务时出现http 400错误,wcf,rest,post,Wcf,Rest,Post,我已经设置了wcf服务。不幸的是,当我通过fiddler、web或其他任何方式调用该服务时,我得到一个http 400错误。我真不知道从哪里着手解决这个问题。如有任何建议,我们将不胜感激。WSDL目前不是一个选项。休息是一项要求。我以前可以使用GET进行调用,但是,GET不安全,因为我需要传递用户ID和密码进行验证,这很容易查看 wcf服务具有以下接口: [WebInvoke(UriTemplate = "/Login", Method="POST", Response

我已经设置了wcf服务。不幸的是,当我通过fiddler、web或其他任何方式调用该服务时,我得到一个http 400错误。我真不知道从哪里着手解决这个问题。如有任何建议,我们将不胜感激。WSDL目前不是一个选项。休息是一项要求。我以前可以使用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);
    }
我想通过fiddler打电话给服务部。我有以下网址:

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

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

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

我只能假设您正在使用:

您没有指定支持XML和JSON的RequestFormat。您的正文既不是JSON也不是XML。

请查看相关帮助。或者,您可以在实现方法中接受流参数,并使用HttpUtility.ParseQueryString实用程序从发布的正文中解析查询字符串值。

尝试一下:

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

[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发布时,请指定
内容类型: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>

检查请求标题中是否缺少“内容类型”?

谢谢您的建议。我手工计算了内容长度,也得到了46。我让费德勒自己算了算。不幸的是,这并没有解决这个问题。json和xml是唯一受支持的格式吗?我认为它们适用于复杂的对象。
{ "AppKey": "blah", "PassWord": "testpwd", "UserName": "test" }
User-Agent: Fiddler
Host: localhost:8889
Content-Length: 113
**Content-Type: text/xml**