tags:

views:

527

answers:

1

I have written a WCF REST Service as follows

namespace UserService
{
    // TODO: Modify the service behavior settings (instancing, concurrency etc) based on the service's requirements. Use ConcurrencyMode.Multiple if your service implementation
    //       is thread-safe.
    // TODO: Please set IncludeExceptionDetailInFaults to false in production environments
    [ServiceBehavior(IncludeExceptionDetailInFaults = true, InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Single)]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    [ServiceContract]
    public class Service 
    {
        UserManager userManager = new UserManager();

        [OperationContract]
        [WebGet(UriTemplate = "{userName}")]
        [WebHelp(Comment = "Gets an user object given the username")]
        public User GetUser(string userName)
        {
            return userManager.Read(userName);
        }

        [OperationContract]
        [WebInvoke(Method = "POST", UriTemplate = "", RequestFormat=WebMessageFormat.Xml, ResponseFormat=WebMessageFormat.Xml, BodyStyle=WebMessageBodyStyle.Bare)]
        [WebHelp(Comment = "Creates an User")]
        public void CreateUser(User user)
        {
            userManager.Create(user);
        }
    }

}

I am accessing this from my ASP.NET application as follows.

HttpClient client = new HttpClient();


        HttpContent content = null;

            DiscussionForum.Library.User user = new User();
            user.UserEmailAddress = emailAddressTextBox.Text;
            user.UserName = userNameTextBox.Text;
            user.UserPassword = passwordTextBox.Text;

            content = HttpContentExtensions.CreateXmlSerializable<DiscussionForum.Library.User>(user);
            content.LoadIntoBuffer();


            HttpResponseMessage response = client.Post(new Uri("http://localhost/UserService/Service.svc"),"application/xml", content);

            Response.Write(response.StatusCode.ToString());

I am getting a Badrequest 400 in the status code on the client side.

Am I missing something?

A: 

Well, one thing I immediately see is that your service uses the DataContractSerializer and your client uses the XmlSerializer, and so the XML representations of the "User" type probably aren't the same.

Either use the [XmlSerializerFormat] attribute on the service, or use HttpContentExtensions.CreateDataContract on the client (but not both of course :)

But I'm not 100% sure that this is your problem (or the only problem)... If it's not, reply here and I can help with some debugging tips.

Eugene Osovetsky