【发布时间】: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