Asp.net mvc 4 如何使用MVC4WebAPI服务

Asp.net mvc 4 如何使用MVC4WebAPI服务,asp.net-mvc-4,asp.net-web-api,Asp.net Mvc 4,Asp.net Web Api,我是WebAPI世界的新手,我在新的MVC4WebAPI中看到了很多应用的潜力。我已经生成了一个WCF Web服务,但计划了解Web API及其Web服务功能。现在,MVC4WebAPI服务更像是前端吗?我通过在MVC4WebAPI中在线跟踪一些示例编写了一个示例服务,但是如何仅在一个基本控制台应用程序中使用该服务呢?我发现使用它的唯一方法是使用HttpClient,还有其他方法吗?我习惯于使用ASP.NET Web服务和WCF Web服务作为引用,您可以在引用中将其作为服务引用,然后可以查看其

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

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

webservice将在内部使用,拥有WebAPI服务值得吗

非常感谢您帮助我澄清有关web api服务的一些问题。

--根据评论编辑---

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

因此,
ControllerLib
是一个单独的类库项目,作为
服务参考
引入主项目(屏幕截图中未显示,但应位于SecondMVCapApplication项目的References文件夹中)。两个控制器文件(
HomeController.cs
LocationController.cs
是实现控制器类的控制器文件,它与使用模板创建新MVC4应用程序时的控制器文件相同)

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

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

---结束编辑---

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

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

  • 如何仅在一个基本的控制台应用程序中使用该服务
好吧,有两种方法可以做到这一点。如果要将这些API作为服务引用使用,则需要执行以下操作。另一种是使用HTTP操作(我将在关于HTTP客户机的问题中提到,并使用服务引用方法保留此答案)

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

尽管如此,正如我在对问题的评论中提到的,如果它是一个大型应用程序,那么你需要将它们分成不同的项目,使应用程序模块化和灵活。因此,您将最终创建不同的
服务库
。如果您沿着
服务库
的道路走下去,那么您只需使用
添加引用
选项将您的API/项目/您所称的任何内容引入到项目中。(为此,我通常将所有项目放在单个解决方案中,并让VisualStudio管理构建顺序,因为我懒得编写构建脚本)

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

  • 我发现使用它的唯一方法是使用HttpClient,还有其他方法吗
使用web API的一种方法是使用HTTP。您知道如何编写http请求头和处理http响应吗。如果是这样,这是我提到的第二种方式。您通过web服务的URL调用它,然后获取数据并执行任何工作。如果您对在控制台应用程序中使用http的回答是“否”,请参阅以下文章:

  • 如果web api为post方法请求一个对象“任务”,会发生什么情况?例如,我如何填充一个对象“任务”并将其发回web api
我想我在你之前的回答中间接地回答了这个问题(假设你要走HTTP之路)。如果没有,请发表评论,我会看看是否能为您找到一些资源

  • webservice将在内部使用,拥有WebAPI服务值得吗
我在对问题的评论中回答了这个问题。询问你是否需要澄清


希望所有这些都有帮助。

您可以创建自己的客户端服务类
 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
}