RESTful WCF返回错误代码415?

时间:2011-11-08 01:46:11

标签: .net wcf web-services rest httpresponse

当我针对我创建的RESTful Web服务运行客户端时,我得到{"The remote server returned an error: (415) Unsupported Media Type."}。内容类型在客户端中是正确的。该服务在vs 2010中的WCF测试客户端下运行正常。我认为我的问题在于我的客户端代码或我发送/格式化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 个答案:

答案 0 :(得分:1)

您是否可以在客户端上创建相同的数据协定,而不是从xml文件中读取创建对象,将其转换为字节数组并将其发布到流中,并查看您的请求是否成功。

请务必使用Fiddler监控您的请求。

我猜错误的原因是你的xml文件。您只需要确保使用DataContractSerializer反序列化时的xml以与对象相同的格式返回。

使用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;
        }

我想你的客户端并没有传递消息作为它所需的消息体的一部分。希望以上信息对您有所帮助。

答案 1 :(得分:0)

您是否使用Fiddler检查了电线上的实际邮件标题?检查ContentType,即您要发送的内容,以及Accept,您想要回复的内容。 MIME类型都可能导致此问题。

答案 2 :(得分:0)

我有点困惑 - 你说这是一个RESTful服务,但是在你的帖子中你会显示一些名为SOAP的东西 - SOAP和REST不一样!

使用FiddlerWireshark查看客户与工作客户之间的差异,然后进行相应更改。

有关您的类似配置中的工作源代码,请参阅http://social.msdn.microsoft.com/Forums/en/wcf/thread/d11a7997-d60b-4895-8f69-9ef2175087e2

基本上他们在charset添加了ContentType,并且他们在标题中没有使用SOAPAction