2012-03-07 52 views
0

我想写一个C#客户端Web服务API(documentation here,PDF警告)。对API的每个请求都是一个HTTP GET调用,参数在URI中编码。响应是格式良好的XML文档,其内容类型为“text/xml”。每个请求都必须包含我的API密钥作为参数。GET请求到非WCF,纯XML Web服务

可能我自己实现了一个web服务代理,但我的直觉是,有一个内置的.NET库,由实际获得报酬的人编写来思考这个东西。从我所有的搜索和阅读,我想我要使用WCF,但我不能找到文档如何如何使用WCF作为客户,拨打电话到普通的旧XML Web服务。 .NET或Visual Studio中有什么可以帮助我吗?我不使用svcutil.exe,是吗?因为我正在与之交谈的Web服务没有任何元数据。

+1

会简单WebRequest吗? – user1096188 2012-03-07 19:20:14

+0

@ user1096188这是接近我想要的,但它会将响应序列化为对象对我来说?如何定义所述对象,是否有工具?或者我需要自己处理XML与XmlSerializer? – Jay 2012-03-07 19:34:19

回答

0

可以使用的HttpWebRequest调用Web服务API,XML库的响应串.NET对象转换。 下面是一个简单的例子(它得到的错误消息作为我没有一个有效的密钥“提供了无效的API访问密钥”):

static void Main(string[] args) 
    { 
     HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(
      @"http://www.ctabustracker.com/bustime/api/v1/gettime?key=89dj2he89d8j3j3ksjhdue93j" 
      ); 

     using (WebResponse resp = req.GetResponse()) 
     { 
      using (Stream respStream = resp.GetResponseStream()) 
      { 
       using(StreamReader reader = new StreamReader(respStream)) 
       { 
        String respString = reader.ReadToEnd(); 

        Debug.WriteLine(respString); 
        TestBusTimeResponse response = XmlUtil.DeserializeString<TestBusTimeResponse>(respString); 
        Debug.WriteLine(response.Error.Message); 
       } 
      } 
     } 

     Console.ReadLine(); 
    } 

其中XmlUtil.DeserializeString定义为:

public static T DeserializeString<T>(String content) 
    { 
     using (TextReader reader = new StringReader(content)) 
     { 
      XmlSerializer s = new XmlSerializer(typeof(T)); 
      return (T)s.Deserialize(reader); 
     } 
    } 

和TestBusTimeResponse被定义为(实际上,你可以生成XML模式该业务对象类的API文档中指定,使用xsd效用随VS):

[XmlRoot("error")] 
public class TestBusTimeResponseError 
{ 
    [XmlElement("msg")] 
    public String Message 
    { 
     get; 
     set; 
    } 
} 
// Response in the following format: 
// <?xml version="1.0"?> 
// <bustime-response><error><msg>Invalid API access key supplied</msg></error></bustime-response> 
[XmlRoot("bustime-response")] 
public class TestBusTimeResponse 
{ 
    [XmlElement("error")] 
    public TestBusTimeResponseError Error 
    { 
     get; 
     set; 
    } 
} 
+0

谢谢!我意识到这是我需要去的方式,但需要有关反序列化类的帮助。这是一个很大的帮助 – Jay 2012-03-08 19:05:14

0

看看新的HttpClient类,如果是的ASP.NET Web API的一部分。我已经成功地使用它来与stackexchange API交谈,并且它非常易于使用。

+0

我与HttpClient的唯一的问题是,我有形成URI,每次我提出请求序列化响应XML。我希望避免这种情况,可能通过使用工具来定义模型并生成必要的类。 – Jay 2012-03-07 19:30:07

+0

我敢肯定,你可以写,做,对你:) – 2012-03-07 19:46:58

+0

感谢安东尼,我可能会一个消息处理程序。我想看看是否有一个内置于.NET,因为任何自带的框架可能是更好的行之有效的和更重的比我想最终的写作测试。 – Jay 2012-03-07 19:55:20