Post JSON Object to WCF Service Oject always null
I am having problems with "post'.am" where the custom object was always null. I'm on my end of my mind and have been researching this for a couple of days, so if anyone has any ideas please help! thanks in advance
My JQuery looks like
$(document).ready(function () {
$("#register").click(function (e) {
e.preventDefault(); //stop the submit event for the submit button
var Name = $("#register_username").val();
var Email = $("#register_email").val();
var Password = $("#register_password").val();
var Contact = $("#register_contactNumber").val();
var Adress = "Seteelte Town";
var chkUserType = document.getElementById("identity_type_2").checked;
var userinfo = { "request": { "Action": { "Address": Adress, "Children": [], "CityId": 0, "Email": Email, "HomeUser": chkUserType, "ImagePath": "", "IpAdress": "", "IsActive": false, "LastLogin": "", "Name": Name, "Password": Password, "PhoneNumber": Contact, "ProfileHit": 0, "ShowEmail": false, "ShowPhoneNumber": false, "SubscribeNews": false, "UserID": 0}} };
alert("Input: " + JSON.stringify(userinfo));
$.ajax({
type: "POST",
url: '/Services/Membership.svc/AccountAdd',
data: JSON.stringify(userinfo),
dataType: 'json',
contentType: "application/json; charset=utf-8",
success: function (data) {
alert(data.Result);
},
error: onError
});
});
});
My C # Code for WCF
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Membership : IMembership
{
public SMProcessResponse<bool> AccountAdd(SMProcess<User> request)
{
return new SMProcessResponse<bool>(MembershipController.AccountAdd(request.Action));
}
}
C # code to request a process
[DataContract(Namespace = "")]
public class SMProcess<T> : BaseRequest
{
public SMProcess(T obj)
{
// TODO: Complete member initialization
this.Action = obj;
}
[DataMember]
public T Action { get; set; }
}
Here is my Web.config
<configuration>
<connectionStrings>
//here is connection string
</connectionStrings>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<authentication mode="Forms">
<forms loginUrl="~/Account/Login.aspx" timeout="2880" />
</authentication>
<membership>
<providers>
<clear/>
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
applicationName="/" />
</providers>
</membership>
<profile>
<providers>
<clear/>
<add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/>
</providers>
</profile>
<roleManager enabled="false">
<providers>
<clear/>
<add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />
<add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
</providers>
</roleManager>
</system.web>
<system.serviceModel>
<services>
<service name="SelectionMall.Services.Membership">
<endpoint address="" behaviorConfiguration="Services.webHttpBehavior" binding="webHttpBinding" contract="SelectionMall.Services.IMembership" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="Services.webHttpBehavior">
<webHttp defaultOutgoingResponseFormat="Json" automaticFormatSelectionEnabled="true"/>
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
source to share
your JSON request should be something like this
[OperationContract]
[WebInvoke(UriTemplate = "AccountAdd", Method = "POST")]
SMProcessResponse<bool> AccountAdd(SMProcess<User> request);
and your data JSOn
var userinfo = { "request": { "Action": { "Address": Adress, "Children": [], "CityId": 0, "Email": "waheed@gmail.com", "HomeUser": true, "ImagePath": "C:/Waheed.jpg", "IpAdress": "192.168.1.3", "IsActive": true, "LastLogin": "\/Date(1358852299323+0500)\/", "Name": "Waheed Iqbal", "Password": "111111", "PhoneNumber": "+923226270150", "ProfileHit": 10, "ShowEmail": true, "ShowPhoneNumber": true, "SubscribeNews": true, "UserID": 1}} }
after editing Web.config
<behavior name="Services.webHttpBehavior">
<webHttp defaultOutgoingResponseFormat="Json" automaticFormatSelectionEnabled="true" defaultBodyStyle="WrappedRequest" />
</behavior>
amuses
source to share
You must have the correct WebInvoke attribute applied to the WCF operation. Looking at your JSON request, I believe it should be something like
[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json))]
SMProcessResponse<bool> AccountAdd(SMProcess<User> request)
Note that a wrapped body style (or WrappedRequest
) is required , so the JSON input will be treated as wrapped (that is, the parameter name will be a property of the incoming JSON).
Also, you might run into problems with de-serialization SMProcess<T>
because it doesn't have a constructor with a smaller parameter.
Anyway, I would suggest that you start with a simple service (and implementation) declaration such as
public SMProcessResponse<bool> AccountAdd(User request)
{
return new SMProcessResponse<bool>(MembershipController.AccountAdd(request));
}
And then start adding additional nesting, etc.
source to share