RESTful WCF возвращает код ошибки 415? - PullRequest
2 голосов
/ 08 ноября 2011

Я получаю {"The remote server returned an error: (415) Unsupported Media Type."}, когда запускаю клиент с созданным мной веб-сервисом RESTful.Типы содержимого являются правильными в клиенте.Служба работает правильно под тестовым клиентом WCF в версии 2010. Я думаю, что моя проблема в коде моего клиента или в способе отправки / форматирования XML.Любой совет приветствуется.

Использование VS2010, .net4

Код веб-службы:

public Charge GetCharge(Charge aCharge)
    {
        return aCharge;
    }

[ServiceContract(Namespace = "http://www.test.com/Charge")]
public interface IService1
{

    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "getcharge",
      RequestFormat = WebMessageFormat.Xml,
      ResponseFormat = WebMessageFormat.Xml,
      BodyStyle = WebMessageBodyStyle.Bare)]
    Charge GetCharge(Charge aCharge);
}


// Use a data contract as illustrated in the sample below to add composite types to service operations.
[DataContract(Namespace = "http://www.test.com/Charge")]
public class Charge
{
    [DataMember]
    public string ID
    {
        get;
        set;
    }

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


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

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

Код клиента:

HttpWebRequest req = null;
        HttpWebResponse res = null;
        try
        {
            string url = "http://localhost:1657/Service1.svc/getcharge";
            req = (HttpWebRequest)WebRequest.Create(url);
            req.Method = "POST";
            req.ContentType = "application/xml";
            req.Timeout = 30000;
            req.Headers.Add("SOAPAction", url);

            System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
            xmlDoc.XmlResolver = null;
            xmlDoc.Load(@"c:\file\benCharge.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);
        }

Клиент XML:

<Charge xmlns="http://www.test.com/Charge"><ID>1</ID><Hours>10</Hours><Comment>Mobile app development</Comment><DateT>01/01/2011</DateT></Charge>

Ответы [ 3 ]

1 голос
/ 14 ноября 2011

Можете ли вы создать такой же контракт данных на клиенте и вместо чтения из xml-файла создать объект, преобразовать его в байтовый массив и отправить в поток и посмотреть, успешно ли выполнен ваш запрос.

Обязательно следите за своим запросом с помощью Fiddler.

Я предполагаю, что причина ошибки заключается в вашем файле XML.Вам просто нужно убедиться, что XML при десериализации с использованием DataContractSerializer возвращается в том же формате, что и ваш объект.

Некоторый код для публикации с использованием объекта HttpWebRequest:

byte[] requestBodyBytes = ToByteArrayUsingDataContractSer(requestBody);
                request.ContentLength = requestBodyBytes.Length;
                using (Stream postStream = request.GetRequestStream())
                    postStream.Write(requestBodyBytes, 0, requestBodyBytes.Length);


private static byte[] ToByteArrayUsingDataContractSer<T>(T requestBody)
        {
            byte[] bytes = null;
            var serializer1 = new DataContractSerializer(typeof(T));
            var ms1 = new MemoryStream();
            serializer1.WriteObject(ms1, requestBody);
            ms1.Position = 0;
            var reader = new StreamReader(ms1);
            bytes = ms1.ToArray();
            return bytes;
        }

Я полагаю из вашегоклиент, вы не передаете сообщение как часть тела сообщения, в котором оно нуждается.Надеюсь, что приведенная выше информация поможет вам.

0 голосов
/ 08 ноября 2011

Я немного запутался - вы говорите, что это сервис RESTful, но позже в своем посте вы показываете что-то с именем SOAP - SOAP и REST НЕ совпадают!

Использование Fiddler или Wireshark , чтобы увидеть разницу между вашим клиентом и работающим клиентом, а затем соответственно изменить.

Для рабочего исходного кода в аналогичной конфигурации, подобной вашей, см. http://social.msdn.microsoft.com/Forums/en/wcf/thread/d11a7997-d60b-4895-8f69-9ef2175087e2

По существу к ним добавляется charset к ContentType И они не используют SOAPAction в заголовке.

0 голосов
/ 08 ноября 2011

Вы проверяли фактические заголовки сообщений в сети, используя Fiddler?Проверьте и ContentType, то есть то, что вы отправляете, и Accept, что вы хотите вернуть взамен.Любой тип MIME может вызвать эту проблему.

...