Подтвердить что ты не робот

WCF REST POST XML - Удаленный сервер возвратил ошибку: (400) Плохой запрос

Я опубликовал свою службу REST API с помощью Библиотеки услуг WCF и запущен консольным приложением. когда я пытаюсь использовать службу у клиента (другое консольное приложение), я получаю исключение "Bad Request".

см. код ниже: -

[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

<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>

код клиента:

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);
}

содержимое 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>

Я получаю исключение "Bad Request" при вызове метода req.GetResponse(). Просто начал изучать ОТДЫХ. Я застрял с запросом POST. Любая помощь будет высоко оценен. Спасибо заранее.

4b9b3361

Ответ 1

Ваша полезная нагрузка POST должна быть:

<Enroll xmlns="http://www.test.com/Enrollment">
<ClientId>000</ClientId>
<AccountNumber>123</AccountNumber>
<TaxId>123</TaxId>
<TaxType>123</TaxType>
<EmailAddress>123</EmailAddress>
<Pin>123</Pin>
<State>122</State>
</Enroll>

Ответ 2

Пространства имен XML неверны. У меня нет времени исправить его для вас, но он должен находиться в пространстве имен http://www.test.com/Enrollment в соответствии с вашим контрактом на данные.