【问题标题】:Talking to a Web API from a Webforms application从 Webforms 应用程序与 Web API 对话
【发布时间】:2015-12-18 10:36:14
【问题描述】:

我有一个 asp.net webforms 应用程序作为我的 UI 层。这个应用程序负责将一个对象列表发送到我的 DAL 类库,然后它会将这个对象列表发送到 WebAPI 进行处理。

WebAPI 需要检索对象列表,进行处理并返回 OK 状态码。

这可能吗?是否有任何关于如何完成的好的文档?

这是我的网络表单应用程序中的内容:

public static async Task<bool> MyFunction(IList<string> Ids)
{
    using (var client = new HttpClient())
    {
        bool success = false;

        client.BaseAddress = new Uri("http://localhost:9000/");
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        // HTTP GET
        HttpResponseMessage response = await client.GetAsync("api/products/MyProcessFunctionName");
        if (response.IsSuccessStatusCode)
        {
            success = true;
        }

        return success;
    }
}

我需要弄清楚如何将字符串 Id 列表作为参数发送给 WebApi 处理函数。

【问题讨论】:

  • 为什么不可能?如果它是一个 .NET 应用程序,只需使用 HttpClient(或 HttpWebRequest,如果您愿意)来调用目标 Web 服务。
  • 您是否使用 WebAPI 控制器类设置您的项目?

标签: c# asp.net asp.net-web-api2 asp.net-web-api


【解决方案1】:

您可以使用Microsoft.AspNet.WebApi.Client 来使用您的restful API。 这是来自 asp.net 网站的官方示例:

http://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client

如果你需要调用你的自定义函数MyProcessFunction首先你需要在控制器中定义函数

 public IEnumerable<string> MyProcessFunctionName()
 {
 return new string[] { "value1", "value2" };
 }

之后,如果你需要用名字client.GetAsync("api/products/MyProcessFunctionName")来称呼它,你需要change the RouteConfig file to allow API calls by action name

Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { action = "get", id = RouteParameter.Optional }
);

【讨论】:

  • 这个例子正是我所需要的。由于我不是通过 js 与 API 交谈。
  • 我查看了您发布的示例,然后还查看了 asp.net/web-api/overview/older-versions/…,它解释了如何在 API 控制器中设置 CRUD 操作。在我的情况下,我不需要 CRUD 操作,我仍然不明白如何在 GET 请求中传递字符串列表以在 WebApi 中的控制器中运行。
  • 你可以设置一个GET操作而不是返回字符串列表,blogs.msdn.com/b/martinkearn/archive/2015/01/05/…如果你不需要一个restful API(实现动词),你也可以定义自定义方法并直接调用它,但它不是' t 宁静stackoverflow.com/questions/9569270/…
  • 再次感谢您提供更多有用的资源,但是有什么可以告诉我如何将字符串列表或对象列表发送到控制器中的函数。我看到的所有示例要么按名称调用函数,要么传递 Id。即 api/products/MyFunction 或 api/products/1,请查看我的更新代码。
  • 是的,在第一个链接中,您可以看到一个函数,而不是返回字符串列表(即) public IEnumerable MyProcessFunctionName() { return new string[] { "value1", "value2" } ;在stackoverflow链接中,您可以看到如何修改路由配置以按名称调用函数(更新答案)
【解决方案2】:

我假设您已经知道如何在您的项目中设置 Web API 控制器。

这是一个代码示例,用于将数据从 UI 发送回 Web API 控制器方法,然后将数据保存在数据库中,

第 1 步:

在你的前端,我希望你有一个自定义的 javascript 文件来处理任何按钮点击事件。在此,尝试使用 POST 方法将数据从 UI 发送到 Web API,如下所示,

            var StaffSaveRequest = {};
            StaffSaveRequest.StaffDetails = {};
            StaffSaveRequest.StaffDetails.Name = "Test Name";

            $.ajax({
                url: 'api/Staff/SaveStaff', //this is the path to web api controller method
                type: 'POST',                   
                dataType: 'json',
                data: StaffSaveRequest,
                success: function (response, textStatus, xhr) {
                    //handle success 
                },
                error: function (xhr, textStatus, errorThrown) {                        
                    if (textStatus != 'abort') {
                      //handle error
                    }
                }
            });

第 2 步:

添加如下所示的控制器类并查看内联 cmets。然后,该控制器类将与数据访问层中的方法进行交互以保存任何信息。

    public class StaffController : ApiController //inherits ApiController 
    {
        [HttpPost] //add post attribute
        public HttpResponseMessage SaveStaff(StaffSaveRequest staffSaveRequest)
        {
            try
            {            
                var result = StaffManager.Save(staffSaveRequest);//save in database using a method in data access layer
                return Request.CreateResponse(HttpStatusCode.OK, result);//result the response back
            }
            catch (Exception ex)
            {
               //log error
            }
        }

我希望这能让您对从何处以及如何开始有所了解。如果您仍有问题/疑问,请回复。

【讨论】:

  • 感谢您的回答。在我的页面代码隐藏的第 1 步中,我想将所选 Id 的列表发送到 WebApi。我认为在这种情况下我不需要 JavaScript 吗?第 2 步很容易理解。
  • 我很确定我对如何设置我的 Controller 类有很好的理解。我认为当我想从类文件而不是 html/aspx 页面向 WebAPI 发送请求时会出现混淆。
  • 更具体地说,我正在向 WebApi 传递类似于字典格式的东西。它是一个字符串列表,其中包含多个项目,如下所示:123|113、888|333、212 等。WebApi 将处理每组 Id
  • @WilliamVenice,关于您的第一条评论,您是如何从后面的代码中调用 Web API 方法的?如果您已经有代码,请分享。另外,我了解您正在尝试将字典传递给 Web API 方法。但是,这本词典是如何构建的?
  • 无论如何我们可以把它带入聊天吗?您也许可以解决我的一些问题。
【解决方案3】:

可以从您的 webforms 项目中调用 WebApi。这是一个使用 WPF 调用 WebApi 的示例,但对于 webforms 的调用应该相同: http://www.codeproject.com/Articles/611176/Calling-ASP-Net-WebAPI-using-HttpClient

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    相关资源
    最近更新 更多