【问题标题】:How to Consume MVC 4 WebApi Service如何使用 MVC 4 WebApi 服务
【发布时间】:2012-11-01 13:25:59
【问题描述】:

我是 Web Api 世界的新手,我看到新的 MVC 4 Web Api 有很多潜力。我已经生成了 WCF Web 服务,但正计划了解 Web-API 及其 Web 服务功能。现在,MVC 4 Web-Api Service 更像是前端吗?我按照 MVC 4 Web Api 中的一些在线示例编写了一个示例服务,但是我如何在一个基本的控制台应用程序中使用该服务?我已经想出使用它的唯一方法是使用 HttpClient 还有其他方法吗?我习惯于 ASP.NET Web 服务和 WCF Web 服务,因为您在引用中将其作为服务引用,然后您可以看到它的所有对象、属性以进行适当的调用。

如果 web-api 为 post 方法请求对象“任务”会发生什么,例如,我如何填充对象“任务”并将其发布回 web-api?与在 WCF 中一样,由于 WSDL,我能够看到“任务”对象及其属性,因此我能够填充它们并将其发送回服务,这在 web-api 服务中是如何完成的?

webservice 将在内部使用,是否值得拥有 web-api 服务?

非常感谢您帮助解决我对 web-api 服务的一些疑问。

【问题讨论】:

  • 你能把这个问题说清楚一点吗,这很难读。里面似乎也有几个问题,试着缩小你的问题范围
  • @dove 抱歉 :) 我正赶着去开会,急于输入问题,希望现在情况好转?
  • 直接进入内部应用程序的问题,以及是否值得做一个 web-api-service。我有一个问题问你。这只是用作网站吗?如果是这样,那么我就不会做 web-api 服务,而只会使用 MVC 设计。如果您打算将该服务与其他平台(如移动)一起使用,那么可以。您将需要一个数据有效负载。当使用 MVC 做一个网站时,随着应用程序的增长,在一个项目中完成所有事情的标准策略可能会变得很重。因此,您可以根据需要定制不同的项目,使其变得灵活。
  • codeproject上有关于subject的详细描述:codeproject.com/Articles/826359/…

标签: asp.net-mvc-4 asp.net-web-api


【解决方案1】:

---根据评论编辑---

此屏幕截图显示了您可以接近的可能结构。当然,您可以采用最适合您的应用的设计。

所以ControllerLib 是一个单独的类库项目,它作为Service Reference 被引入主项目(屏幕截图中没有显示,但应该在 SecondMVCApplication 项目的 References 文件夹中)。两个控制器文件(HomeController.csLocationController.cs是实现Controller类的控制器文件,和使用模板新建MVC4应用时的Controller文件一样)

所以对于您关于是否存在 SVC 文件的问题。不。在 MVC 4 中,无论应用程序是一个项目还是多个项目的组合,都没有 SVC 文件之类的东西(除非我弄错了)。在SecondMVCApplication 内部,有一个名为RouteConfig.cs 的文件,其中包含路由URL,只要您添加服务引用并且存在控制器功能。代码将运行。此外,我展示的示例屏幕截图还包括一个WebApiConfig.cs 文件。如果需要,您可以使用该文件为移动设备执行 API。因此,常规的RouteConfig.cs 处理网站请求,WebApiConfig.cs 处理 API 请求。

注意事项:如果您将模型项目用作单独的项目(我知道您会这样做,因为它是 M -V-C 项目...呃!!)。确保将连接字符串放在 web.config 主项目中(在本例中为 SecondMVCApplication)。我记得我被困在这个问题上 3 天(每次 8 小时)试图解决这个问题。希望你不要碰到它。

---结束编辑---

以下对您问题的回答主要基于我的知识,可能对所有用户都正确,也可能不正确。

  • MVC 4 Web-Api Service 更像是前端吗?

这取决于您如何看待它。通常,Web-API 服务更适合创建后端服务以向不同平台(如移动、桌面应用程序等)提供数据有效负载。但是,MVC4 Internet 应用程序将包含前端方面,即最终用户看到的视图。

  • 如何在一个基本的控制台应用程序中使用服务?

AFAIK,有两种方法可以做到这一点。如果将 API 作为服务参考使用。另一种是使用 HTTP 操作(我将在您关于 HTTP 客户端的问题中提到,并使用服务参考方法保留此答案)。

这取决于您的应用程序是如何完成的。就像我说的,如果它是一个网站,你的 MVC 模式不需要做任何事情,但是模型、视图和控制器都被设计为在不使用任何服务的情况下协同工作。

虽然,正如我在问题的 cmets 中提到的,如果它是一个大型应用程序,那么您需要将它们分解为不同的项目,以使应用程序模块化和灵活。所以你最终会创建不同的Service Library。如果您走Service Library 的道路,那么您只需使用Add Reference 选项将您的API/Projects/Whatever-you-call-it 引入项目。 (为此,我通常将所有项目放在一个解决方案中,并让 Visual Studio 管理构建顺序,因为我懒得编写构建脚本)。

同样,在控制台应用中使用 Web 服务时也可以应用相同的逻辑。

  • 我已经想出使用它的唯一方法是使用 HttpClient 还有其他方法吗?

使用 Web API 的一种方法是使用 HTTP。您是否知道如何编写 http 请求标头和处理 http 响应。如果是这样,这是我提到的第二种方式。您通过它的 URL 调用 Web 服务,然后获取数据并执行任何工作。如果您对在控制台应用程序中使用 http 的回答是 NO,请查看此帖子:Create HTTP post request and receive response using C# console application

  • 如果 web-api 为 post 方法请求对象“Task”会发生什么,例如,我如何填充对象“Task”并将其发送回 web-api?

我想我在您之前的回答中间接回答了这个问题(假设您要走 HTTP 之路)。如果没有,请发表评论,我会看看是否可以为您找到一些资源。

  • Web 服务将在内部使用,是否值得拥有一个 web-api 服务?

我在对问题的评论中回答了这个问题。询问您是否需要澄清。

希望这一切对您有所帮助。

【讨论】:

  • 非常感谢您回答问题。我还有更多:)。您是否必须在 MVC 中包含 SVC 文件才能使其成为服务,或者将其用作控制器就足够了?因为当我获取我的 URL 并尝试将其添加为参考时,它不起作用?
  • 再次查看答案以进行编辑以回答您的问题。我解释说,您的 URL 路由将位于您的主项目中,而控制器位于单独的库中。 注意: 这是一种方法,并不意味着您必须遵循此方法。每个人都有自己的做法。这只是为您简化。
  • 仅供参考,我参与的一个项目,我们最终完成了 4+ 个不同的项目。模型 (DAL) 项目、业务逻辑项目、多控制器项目(它们在那里知道在请求 URL 时要调用哪个业务逻辑,因为我们不想重复多个控制器中所需的代码,而您永远不应该从一个控制器调用另一个控制器。最后,有处理演示内容的 View 项目。
  • 史蒂文,当我尝试向我的控制台应用程序添加对localhost/wmwebservicetest/api/CAD 的服务引用时,它给了我一个错误,说没有可识别的文档类型。知道我在做什么错吗?这是我的 sln img4.imageshack.us/img4/3595/captureumcq.png 的图片链接
【解决方案2】:

您可以创建自己的客户端服务类,为每个请求提供服务。

 public class ClientService
{
    #region async helper methods

    private static string m_mediaTypeHeaderValue= "application/json";
    static HttpClient client = new HttpClient();
    static HttpClient createHttpClientInstance()
    {          
        return client ?? new HttpClient();
    }

    // SELECT

    internal static async Task<T> Get<T>(string endpoint)
    {
                client= createHttpClientInstance();
               var response = await client.GetAsync(endpoint);
            string content = await response.Content.ReadAsStringAsync();
            return await Task.Run(() => JsonConvert.DeserializeObject<T>(content));
    }
    // INSERT

    static async Task<T> Post<T>(string endpoint, object data)
    {
        client = createHttpClientInstance();
        var httpContent = new StringContent(JsonConvert.SerializeObject(data));
            httpContent.Headers.ContentType = new MediaTypeHeaderValue(m_mediaTypeHeaderValue);
            var response = await client.PostAsync(endpoint, httpContent);
            string content = await response.Content.ReadAsStringAsync();
            return await Task.Run(() => JsonConvert.DeserializeObject<T>(content));
    }

    // UPDATE

    static async Task<T> Put<T>(string endpoint, object data)
    {
        client = createHttpClientInstance();
        var httpContent = new StringContent(JsonConvert.SerializeObject(data));
            httpContent.Headers.ContentType = new MediaTypeHeaderValue(m_mediaTypeHeaderValue);

            var response = await client.PutAsync(endpoint, httpContent);
            string content = await response.Content.ReadAsStringAsync();
            return await Task.Run(() => JsonConvert.DeserializeObject<T>(content));
    }

    // DELETE

    static async Task<T> Delete<T>(string endpoint)
    {
    client = createHttpClientInstance();
    var response = await client.DeleteAsync(endpoint);
            string content = await response.Content.ReadAsStringAsync();
            return await Task.Run(() => JsonConvert.DeserializeObject<T>(content));
    }

    #endregion
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多