如何使用XDocument调用Web服务?

问题描述:

假设我有在以下地址的ASMX Web服务: http://localhost/BudgetWeb/Service.asmx如何使用XDocument调用Web服务?

此Web服务有一个Web方法具有以下签名:

string GetValue(string key) 

该GetValue方法返回一个字符串像这样:

<?xml version=\"1.0\" encoding=\"utf-8\" ?><value>250.00</value> 

如果我想这样做:

XDocument doc = XDocument.Load("http://localhost/BudgetWeb/Service.asmx?op=GetValue&key=key1") 

这不起作用,我很肯定XDocument.Load实际上并没有在服务器上调用Web方法。我认为它期望uri指向它可以加载的文件。要调用Web方法,我想我必须有一个Web代理类,并且必须使用它来调用string GetValue(string key),然后我可以使用从Web代理类返回的值传递给XDocument.Load方法。

我的理解是否正确,或者有没有办法让XDocument.Load实际调用服务器上的Web方法?

+0

如果您的客户端需要Web服务,需要通过服务引用和HTTP使用,请使用WCF,而不要使用ASMX。 WCF支持一个服务的多个端点:f.e.一个用于REST(HTTP通信,使用POST和GET),另一个用于SOAP。容易被.Net,Java和其他框架使用。 – 2009-12-13 23:00:50

尝试使用此:

XDocument doc = XDocument.Load(
     "http://localhost/BudgetWeb/Service.asmx/GetValue?key=key1"); 

编辑:就想通了:您使用的是无效的URI:

http://localhost/BudgetWeb/Service.asmx?op=GetValue&key=key1 

应该

http://localhost/BudgetWeb/Service.asmx/GetValue?key=key1 

我m使用此代码片段:

string uri = "http://www.webservicex.net/stockquote.asmx/GetQuote?symbol=MSFT"; 
XDocument doc1 = XDocument.Load(uri); 
Console.WriteLine(doc1.Root.Value); // <StockQuotes><Stock><Symbol>MSFT... 
+0

当我尝试这样做时,我得到System.Xml.XmlException:第71行上的'input'开始标记与'td'的结束标记不匹配。第71行,位置98.它与我在没有XmlReader.Create部分时获得的基本相同的错误。 – dcp 2009-12-13 22:09:55

+0

您的xml格式不正确,这与Load无关。使用http://validator.w3.org/来验证示例呼叫。 – 2009-12-13 22:11:18

+0

对不起,这是一个错字。尽管如此,我仍然得到同样的例外 – dcp 2009-12-13 22:15:41

好吧,我发现了这个问题。在web.config中为Web服务,你必须补充一点:

<webServices> 
    <protocols> 
     <add name="HttpGet"/> 
     <add name="HttpPost"/> 
    </protocols> 
</webServices> 

感谢大家的建议,我真的很感激,尤其是鲁本斯·法里亚斯其工作的例子让我在正确的轨道上。

+0

你在我有机会之前写下了它。但是现在你可以看到负载工作。另外你为什么要这样做而不是创建服务引用? – 2009-12-13 22:44:31

+0

是的,它现在可以工作,并再次感谢您的帮助。客户的要求是,Web服务调用作为uri而不是使用服务引用来调用,所以我没有使用服务引用的选项。我正在嘲笑我的测试的Web服务,并且我排除了协议的原因,这就是为什么它不起作用,除了正确地指出了uri本身的一些问题之外。 – dcp 2009-12-13 22:51:49

+1

@dcp:如果Rubens Farias的例子有帮助,那么您应该将其标记为答案。 – 2009-12-14 06:19:25