当我针对我创建的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>
答案 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不一样!
使用Fiddler或Wireshark查看客户与工作客户之间的差异,然后进行相应更改。
有关您的类似配置中的工作源代码,请参阅http://social.msdn.microsoft.com/Forums/en/wcf/thread/d11a7997-d60b-4895-8f69-9ef2175087e2
基本上他们在charset
添加了ContentType
,并且他们在标题中没有使用SOAPAction
。