【问题标题】:Sending GET requests from a .NET client to a non-WCF, plain XML web service将 GET 请求从 .NET 客户端发送到非 WCF、纯 XML Web 服务
【发布时间】:2012-03-07 19:15:11
【问题描述】:

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

可以自己实现一个 Web 服务代理,但我的直觉是,有一个内置的 .NET 库是由真正获得报酬的人编写的。从我所有的搜索和阅读中,我想我想使用 WCF,但我找不到文档如何使用 WCF 作为 client,调用一个 plain old XML web service 。 .NET 或 Visual Studio 中有什么可以帮助我的吗?我不使用 svcutil.exe,是吗?因为我正在与之交谈的网络服务没有任何元数据。

【问题讨论】:

  • @user1096188 这与我想要的很接近,但它会为我将响应序列化为对象吗?我如何定义所述对象,有工具吗?或者我是否需要自己处理 XML,例如使用 XmlSerializer?

标签: c# .net wcf visual-studio .net-4.0


【解决方案1】:

您可以使用 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 被定义为(您实际上可以使用 VS 附带的xsd 实用程序,使用 API 文档中指定的 XML 模式生成此业务对象类):

[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;
    }
}

【讨论】:

  • 谢谢!我意识到这是我需要走的路,但需要反序列化类的帮助。这是一个很大的帮助
【解决方案2】:

看看作为 ASP.NET Web Api 一部分的新 HttpClient 类。我已成功使用它与 stackexchange API 对话,而且非常易于使用。

【讨论】:

  • 我对 HttpClient 的唯一问题是我必须在每次发出请求时形成 URI 并序列化响应 XML。我希望避免这种情况,可能通过使用工具来定义模型并生成必要的类。
  • 我相信你可以编写一个消息处理程序来为你做这件事:)
  • 谢谢安东尼,我可能会的。我想看看 .NET 中是否内置了一个,因为框架附带的任何东西都可能比我最终编写的内容得到更好的证明和更严格的测试。
  • 我太清楚了。我在 WCF Web Api 时代编写了一个验证操作处理程序,只是在我迁移到 ASP.NET Web Api 时才使用它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多