编辑:
我基于一些已删除的注释,我想我需要添加一个服务引用,并在客户端应用程序中创建一个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。
答案 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服务。