tags:

views:

4889

answers:

2

I have exposed my REST API service using WCF Service Library and started by console application. when I try to consume the service from client ( another console application), I am getting "Bad Request" exception.

please see the code below :-

[ServiceContract(Namespace = "http://www.test.com/Enrollment")]
public interface IEnrollService
{
    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "enroll", 
           RequestFormat = WebMessageFormat.Xml, 
           ResponseFormat = WebMessageFormat.Xml, 
           BodyStyle= WebMessageBodyStyle.Bare)]
    string EnrollData(Enroll enrData);
}

public class EnrollService : IEnrollService
{
    public string EnrollData(Enroll enrData)
    {
        return "Hello, your test data is " + enrData.AccountNumber; 
    }
}

DataContract

[DataContract(Namespace = "http://www.test.com/Enrollment")]
public class Enroll
{

    [DataMember]
    public string ClientId
    {
        get;
        set;
    }

    [DataMember]
    public string AccountNumber
    {
        get; 
        set; 
    }

    [DataMember]
    public string TaxId
    {
        get; 
        set; 
    }

    [DataMember]
    public string TaxType
    {
        get; 
        set; 
    }

    [DataMember]
    public string EmailAddress
    {
        get; 
        set; 
    }

    [DataMember]
    public string Pin
    {
        get; 
        set; 
    }

    [DataMember]
    public string State
    {
        get; 
        set; 
    }

}

app.config settings

<system.serviceModel>
  <services>
    <service name="OEA.REST.EnrollService" behaviorConfiguration="OEABehavior">
      <endpoint address="http://localhost:8010/OEA/Service/EnrollService" 
                binding="webHttpBinding" behaviorConfiguration="webHttp"
                contract="OEA.REST.IEnrollService" />
      <host>
        <baseAddresses>
          <add baseAddress="http://localhost:8010/OEA/Service/EnrollService" />
        </baseAddresses>
      </host>
    </service>
  </services>
  <behaviors>
    <endpointBehaviors>
      <behavior name="webHttp">
        <webHttp/>
      </behavior>
    </endpointBehaviors>
    <serviceBehaviors>
      <behavior name="OEABehavior">
        <serviceMetadata httpGetEnabled="True" />
        <serviceDebug includeExceptionDetailInFaults="True" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>

client code:

HttpWebRequest req = null;
HttpWebResponse res = null;
try
{
    string url = "http://localhost:8010/OEA/Service/EnrollService/enroll";
    req = (HttpWebRequest)WebRequest.Create(url);
    req.Method = "POST";
    req.ContentType = "application/xml; charset=utf-8";
    req.Timeout = 30000;
    req.Headers.Add("SOAPAction", url);              

    System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
    xmlDoc.XmlResolver = null;
    xmlDoc.Load(@"d:\test.xml");
    string sXML = xmlDoc.InnerXml;
    req.ContentLength = sXML.Length;
    System.IO.StreamWriter sw = new System.IO.StreamWriter(req.GetRequestStream());
    sw.Write(sXML);
    sw.Close();

    res = (HttpWebResponse)req.GetResponse();
}
catch (Exception ex)
{
    System.Console.WriteLine(ex.Message);
}

content of test.xml

<Enroll>
    <ClientId>000</ClientId>
    <AccountNumber>123</AccountNumber>
    <TaxId>123</TaxId>
    <TaxType>123</TaxType>
    <EmailAddress>123</EmailAddress>
    <Pin>123</Pin>
    <State>122</State>
</Enroll>

I am getting "Bad Request" exception on req.GetResponse() method call. Just started learning REST. I am stuck up with POST request. Any help would be highly appreciated. Thanks in advance.

+4  A: 

Your XML namespaces are wrong. I don't have time to correct it for you, but needs to be in the "http://www.test.com/Enrollment" namespace according to your data contract.

John Saunders
I have used same kind of namespace specification thru out my wcf implementation. I never faced this is kind of issues.
Ganesan Subbian
The post from PulsarBlow shows exactly what I said. Your XML was in the wrong namespace.
John Saunders
+2  A: 

Your POST payload should be :

<Enroll xmlns="http://www.test.com/Enrollment"&gt;
<ClientId>000</ClientId>
<AccountNumber>123</AccountNumber>
<TaxId>123</TaxId>
<TaxType>123</TaxType>
<EmailAddress>123</EmailAddress>
<Pin>123</Pin>
<State>122</State>
</Enroll>
PulsarBlow
I updated the xml as per your response. That issue got resolved. Thanks a lot
Ganesan Subbian