如何使用MVC 4 Web Api服务

时间:2012-11-01 13:25:59

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

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

如果web-api正在请求对象,会发生什么?#34;任务"以post方法为例,我如何填充对象" Task"并将其发回web-api?和在WCF中一样,我能够看到"任务"对象及其属性因为WSDL所以我能够填充它们并将其发送回服务如何在web-api服务中完成?

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

非常感谢你帮我解决了一些关于web-api服务的问题。

2 个答案:

答案 0 :(得分:2)

--- 按评论编辑 ---

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

Sample MVC Application

所以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 -VC项目...... DUH !!)。确保将连接字符串放在web.config主项目中(在本例中为SecondMVCApplication)。我记得我在这个问题中被困3天(每个8小时)试图解决这个问题。希望你不要碰到它。

--- 结束编辑 ---

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

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

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

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

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

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

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

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

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

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

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

我想我在你之前的回答中间接回答了这个问题(假设您将采用HTTP方式)。如果没有,那么评论,我会看看我是否可以找到一些资源。

  • 网络服务将在内部使用是否值得拥有web-api服务?

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

希望这一切都有所帮助。

答案 1 :(得分:0)

您可以创建自己的客户服务类,以满足每个请求。

 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
}