Reputation: 7165
I use WCF Rest 40(CS) Template for my REST project.
I didn't get any problem when passing a data through URL:
http://localhost:8525/Device/Login?deviceID=testid&password=a&serialNum=testserial
But when passing Json data, I get:
HTTP/1.1 400 Bad Request
Server: ASP.NET Development Server/10.0.0.0
Date: Fri, 17 Feb 2012 08:41:38 GMT
X-AspNet-Version: 4.0.30319
Content-Length: 1647
Set-Cookie: ASP.NET_SessionId=4tez22jvuy0s3tiioctukvdq; path=/; HttpOnly
Cache-Control: private
Content-Type: text/html
Connection: Close
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Request Error</title>
<style>BODY { color: #000000; background-color: white; font-family: Verdana; margin-left: 0px; margin-top: 0px; } #content { margin-left: 30px; font-size: .70em; padding-bottom: 2em; } A:link { color: #336699; font-weight: bold; text-decoration: underline; } A:visited { color: #6699cc; font-weight: bold; text-decoration: underline; } A:active { color: #336699; font-weight: bold; text-decoration: underline; } .heading1 { background-color: #003366; border-bottom: #336699 6px solid; color: #ffffff; font-family: Tahoma; font-size: 26px; font-weight: normal;margin: 0em 0em 10px -20px; padding-bottom: 8px; padding-left: 30px;padding-top: 16px;} pre { font-size:small; background-color: #e5e5cc; padding: 5px; font-family: Courier New; margin-top: 0px; border: 1px #f0f0e0 solid; white-space: pre-wrap; white-space: -pre-wrap; word-wrap: break-word; } table { border-collapse: collapse; border-spacing: 0px; font-family: Verdana;} table th { border-right: 2px white solid; border-bottom: 2px white solid; font-weight: bold; background-color: #cecf9c;} table td { border-right: 2px white solid; border-bottom: 2px white solid; background-color: #e5e5cc;}</style>
</head>
<body>
<div id="content">
<p class="heading1">Request Error</p>
<p>The server encountered an error processing the request. See server logs for more details.</p>
</div>
</body>
</html>
Method not Allowed
(Response using Fiddler)
In side service:
namespace WCFRest.Rest
{
[ServiceContract]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class DeviceComponent
{
[WebInvoke(UriTemplate = "Login?deviceID={deviceID}&password={password}&serialNum={serialNum}", Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
public WRModel.Entities.Session Login(string deviceID, string password, string serialNum)
{
string ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
WRModel.Interfaces.IDeviceComponent svc = WRModel.Logic.ConfigAndResourceComponent.Containers().Resolve<WRModel.Interfaces.IDeviceComponent>();
return svc.Login(deviceID, password, serialNum, ip);
}
[WebInvoke(UriTemplate = "Logout", Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
public bool Logout(WRModel.Entities.DeviceSession deviceSession)
{
WRModel.Interfaces.IDeviceComponent svc = WRModel.Logic.ConfigAndResourceComponent.Containers().Resolve<WRModel.Interfaces.IDeviceComponent>();
return svc.Logout(deviceSession);
}
}
}
The Login part works fine, but the Logout causes error. Where did I go wrong? Thanks for help. Here some image using fiddler:
EDIT
DeviceSession Entity
[DataContract(Name = "DeviceSession", Namespace = "http://MySite.com/1.0/DeviceSession")]
public class DeviceSession : IDeviceSession
{
public DeviceSession()
{
}
public DeviceSession(string session, string loginID, string serial)
{
Session = session;
LoginID = loginID;
Serial = serial;
}
string _session;
[DataMember(Order = 0)]
public string Session
{
get { return _session; }
set { _session = value; }
}
string _LoginID;
[DataMember(Order = 1)]
public string LoginID
{
get { return _LoginID; }
set { _LoginID = value; }
}
string _serial;
[DataMember(Order = 2)]
public string Serial
{
get { return _serial; }
set { _serial = value; }
}
}
Upvotes: 1
Views: 11429
Reputation: 34309
You have actually done slightly different things in each example. In the first example (login) you are posting variables on the url, in the second you are posting in the body.
Whats important to note is that the JSON you need to post in the second example is the json for string, not the json for an object containing a string. This means that the json isnt valid for the type string.
What i would recommend is to wrap it in an object or call it on the query string as in your first example.
For example you could use
[WebInvoke(UriTemplate = "Login", Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
public WRModel.Entities.Session Login(LoginDetails details)
Where login details is a class containing deviceId Password serialNumber
Upvotes: 3