【问题标题】:Adding service reference for Asp.Net webservice为 Asp.Net webservice 添加服务参考
【发布时间】:2016-06-01 18:41:23
【问题描述】:

编辑:
我基于一些已经被删除的cmets,我想我需要添加一个服务引用并在客户端应用程序中创建一个webservice对象的实例来传递数据集。我无法添加服务参考。当服务运行时,它给出了一个 403 禁止错误,并且自从我第一次创建项目以来就已经这样做了。我认为这很好,因为仍然可以使用 HTTP GET 访问 apicontroller 方法,但是我无法实际将对象发送到服务,也无法创建服务引用。服务和客户端位于不同的项目中。在这一点上,即使是一个体面的教程的链接也会有所帮助。我找到了很多东西来创建一个完整的站点,其中包含一些在 jquery 中访问的函数,还有很多东西,包括如何在 C# 中发送帖子,但没有任何东西可以结合双方。 我看到this question 询问如何做类似的事情。我在 c# 中的客户端代码和问题中的 javascript 有什么区别吗?

编辑2: 我尝试使用内存流查看请求内容,以查看是否正在传输整个数据集。它仅从正在传输的 350000 个字节中提取 4000 个左右的字节。我认为这就是为什么数据集在 webservice 参数中不可用的原因。但我不确定如何继续。

原文:

我正在构建一个 Web 服务来处理我的客户端应用程序的数据库调用。这不是公开的,所以我可以传递数据集而不是自定义模型。这是客户端代码:

public static void TestSendToDatabase(DataSet Products)
{
        string xml = ToXML(Products);
        byte[] bytes;
        bytes = System.Text.Encoding.ASCII.GetBytes(xml);

        StringBuilder urlBuilder = new StringBuilder(string.Format("{0}{1}", BaseUrl, "WalmartProducts/Update"));
        string url = urlBuilder.ToString();

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Accept = "application/xml";
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.ContentLength = bytes.Length;

        Stream requestStream = request.GetRequestStream();
        requestStream.Write(bytes,0,bytes.Length);

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();

以及服务代码:

public class WalmartProductsController : ApiController
{
    [HttpPost]
    [ActionName("Update")]
    public object UpdateWalmartProducts([FromBody] byte[] bytes)
    {
        string xml = System.Text.Encoding.ASCII.GetString(bytes);
        DataSet productsFromClient = LoadFromXMLString(xml);
        DataUpdater.UpdateWalmartData(productsFromClient.Tables[0]);
        return DataUpdater.GetProducts();
    }

Web 服务中的字节数组为空。我确信我在混合不应该混合的方法,但我已经阅读了至少三十篇文章试图解决这个问题,感觉每篇文章都有完全不同的方法。 Web 服务当前以 xml 格式返回数据集,因此我更愿意坚持使用 xml 而不是 json。

【问题讨论】:

  • 我对 ApiController 类不熟悉。我们使用传递数据集的 Web 服务,但它们都派生自 System.Web.Services.WebService 类。这些可能有点过时,但在 Visual Studio 中,如果添加新项目,则选择 Web\Web Service (ASMX)。然后,您可以使用属性使这些 Web 服务支持 SOAP 或 AJAX 调用。
  • 我会调查的。我最近读到的所有内容都说不要使用 asmx。如果它有效,那么它是值得的。

标签: c# asp.net web-services http-post


【解决方案1】:

这不是一个完整的答案,但也许它是一个起点。 .NET 支持两种主要的 Web 服务编写技术。第一种是使用 .asmx 文件的旧技术。这种方法通常称为 SOAP 方法,Visual Studio 在 .wsdl 文件中生成方法的签名。由于签名已公开,因此您可以要求 Visual Studio 为您创建一个 Web 参考文件。此 Web 参考将所有 Web 服务公开为简单的类和方法,隐藏了跨 Web 服务通信的所有复杂性。任何可以序列化的对象,包括 DataSet 对象,都可以作为这些 Web 方法的参数包含在内,并且 .NET 将在这些对象通过 HTTP 边界时负责序列化和反序列化。我相信微软随后在他们称为 WCF 的产品中封装了许多不同的通信技术,它应该允许您使用配置来选择是使用 HTTP 进行通信还是使用 TCP/IP。

这种方法的缺点是,如果您在 API 中使用任何 MS 类,您就有效地将您的产品与 MS 绑定在一起,那么任何非 MS 客户端都很难与您的 Web 服务进行通信。 DataSet 对象是一个极其复杂的对象,我认为尝试编写自己的序列化/反序列化方法来发送 DataSet 是非常不切实际的.

另一种越来越流行的 Web 服务方法是使用 REST API。最近,MS 增加了对这些的支持,ApiController 是起点之一。如果你在谷歌上搜索“ASP.NET REST API 教程”,你应该会找到各种示例。但是,使用这种方法,我不鼓励您使用 DataSet 类。我在诸如字典之类的类方面取得了一些成功,前提是您放入字典中的对象类都可以分解为相当简单的组件。尝试使用像 DataSet 这样复杂的 MS 类可能会导致很多挫败感,并且会产生一个很少有客户端可以使用的 Web 服务。

【讨论】:

    猜你喜欢
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多