添加Asp.Net webservice的服务引用

时间:2016-06-01 18:41:23

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

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

EDIT2: 我尝试使用内存流来查看请求内容,以查看是否正在传输整个数据集。它只转移了350000个大约4000个字节。我假设这就是数据集在web服务参数中不可用的原因。但我不确定如何继续。

原件:

我正在构建一个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服务中的字节数组为空。我确信我混合的方法不应该混合,但我已经完成了至少30篇试图解决这个问题的文章,感觉每个人都有完全不同的方法。方法。 webservice目前以xml格式返回数据集,所以我更喜欢在json上使用xml。

1 个答案:

答案 0 :(得分:0)

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

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

越来越流行的另一种Web服务方法是使用REST API。最近,MS增加了对这些的支持,而 ApiController 是其中一个起点。如果你google" ASP.NET REST API教程"你应该找到各种各样的例子。但是,通过这种方法,我会阻止您使用 DataSet 类。我已经在使用Dictionary这样的类方面取得了一些成功,只要你放入字典中的对象类都解析为相当简单的组件。尝试使用像 DataSet 这样复杂的MS类可能会导致很多挫败感,并且会产生很少客户可以使用的Web服务。