我正在尝试在使用WebClient访问Web服务上的WebMethod的类中创建一个方法,并且遇到了问题。在Windows上使用VS2010。
首先,是的,我知道我可以在类库中创建Web服务的Web引用,当然这是设计时绑定。但是,我需要能够使用仅在运行时提供的信息来访问Web服务。这有一个商业原因,我不会进入这里,请随便一起去。
使用System.Net命名空间中的WebClient类似乎是可行的。事实上,我能够得到有问题的服务,但我发送给它的数据似乎没有正确的格式,尽管我可以说它是一个格式正确的SOAP消息。
WebException包含以下消息:“远程服务器返回错误:(415)不支持的媒体类型。”
以下是代码:
public string DoingBusiness()
{
WebClient client = new WebClient();
string destUri = "http://localhost/Service/Service.asmx?op=CommunicationsCheck";
StreamReader reader = new StreamReader(@"CommCheck.xml");
string data = String.Format(reader.ReadToEnd(), "The End is Near!");
reader.Close();
string response = client.UploadString(destUri, data);
return response;
}
离开敏感的实际xmlns,上面的StreamReader读取的数据如下所示:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<CommunicationsCheck xmlns="http://.../">
<communication>{0}</communication>
</CommunicationsCheck>
</soap:Body>
</soap:Envelope>
这看起来像一个完美的SOAP消息。当然,“{0}”会填充有效负载字符串。如果WebMethod“CommunicationsCheck(字符串通信)成功运行,它将返回:
<?xml version="1.0" encoding="utf-8" ?>
<string xmlns="http://[service url]/">You sent 'The End is Near!'</string>
如果我通过浏览器或通过设计时网络参考访问服务,它会做什么。
所以,问题是,我在这里做错了,我得到了“(415)不支持的媒体类型”
是否需要设置WebClient上的属性?我是否需要提供包含UserAgent的Header?或其他什么?
答案 0 :(得分:7)
织补。我想我应该让别人回答这个问题,但回答一个人自己的问题是可以接受的,如果你发现自己的话。
无论如何,对这个问题的一些进一步研究似乎表明,我个人猜测,即可能需要设置一些Header属性,这是一个可能的解决方案。研究表明,属性将是“内容类型”,需要设置为“text / xml”。所以我添加了这一行:
client.Headers.Add("content-type", "text/xml");
在UploadString方法调用之前。
宾果!
发生了预期的反应。
有人曾经注意到,一旦提出问题,有些问题的答案有时会变得不言而喻,但之前不是吗?有趣的现象。