我已经设置了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
答案 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”?