0

我是 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 方法请求对象“Task”会发生什么情况,我如何才能填充对象“Task”并将其发布回 web-api?与在 WCF 中一样,由于 WSDL,我能够看到“任务”对象及其属性,因此我能够填充它们并将其发送回服务,这是如何在 web-api 服务中完成的?

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

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

4

2 回答 2

2

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

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

示例 MVC 应用程序

一个单独的类库项目也是如此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/Projects/Whatever-you-call-it 引入项目。(为此,我通常将所有项目放在一个解决方案中,并让 Visual Studio 管理构建顺序,因为我懒得编写构建脚本)。

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

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

使用 Web API 的一种方法是使用 HTTP。您是否知道如何编写 http 请求标头和处理 http 响应。如果是这样,这是我提到的第二种方式。您通过它的 URL 调用 Web 服务,然后获取数据并执行任何工作。如果您在控制台应用程序中使用 http 的答案是否定的,请查看这篇文章:使用 C# 控制台应用程序创建 HTTP 发布请求并接收响应

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

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

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

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

希望这一切都有帮助。

于 2012-11-01T14:33:47.577 回答
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
}
于 2017-11-29T18:01:56.260 回答