使用C#

时间:2017-08-02 09:04:26

标签: c# entity-framework web-services visual-studio-2015

我被分配了一个接收和发布数据的Web服务。但是,我对此非常陌生,即使在查看了多个示例并尝试遵循它们之后,我也有点难以理解。

参考例子:

Link 1

Link 2

我作为模型和控制器的参考给出的代码如下:

模型

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Threading.Tasks;

namespace Webservice.Models.ApiModels {
    public class SecondlyReading {
        [Key]
        public int Id { get; set; }
        [Required]
        public int Name { get; set; }
        [Required]
        public string TimeStamp { get; set; }
        [Required]
        public string Date { get; set; }
        [Required]

    }
}

控制器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web.Http;
using SmartDBWeb.Data;
using Microsoft.AspNetCore.Authorization;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using SmartDBWeb.Models.ApiModels;
using Microsoft.EntityFrameworkCore;


namespace Webservice.Controllers.Api {
    [Route("api/[controller]")]
    [Authorize]
    public class WebserviceController : Controller {
        private ApplicationDbContext _context;


        public WebserviceController(ApplicationDbContext context) {
            _context = context;
        }

        // GET: api/Webservice
        [HttpGet]
        public IEnumerable<Webservice> GetSecondlyReadings() {
            return _context.Webservice.ToList();
        }

        // GET api/Webservice/id
        [HttpGet("{id}")]
        public async Task<IActionResult> GetWebservice(int id) {
            var reading = await _context.Webservice.SingleOrDefaultAsync(c => c.Id == id);
            if (reading == null) {
                return NotFound();
            }

            return Ok(reading);
        }

        [HttpPost]
        public IActionResult PostWebservice([FromBody]List<Webservice> Readings) {
            if (!ModelState.IsValid) {
                return BadRequest();
            }
            foreach (Webservice reading in Readings) {
                _context.Webservice.Add(reading);
            }

            _context.SaveChanges();
            return CreatedAtAction("GetWebservice", new { id = Readings[0].Id }, Readings[0]);
        }
    }
}

我的主要问题是如何使用上述代码。我发现(可能不正确)的是,模型是数据本身,控制器将模型和视图链接在一起。

3 个答案:

答案 0 :(得分:0)

首先问问自己网络传播通常如何运作。通过输入地址通过浏览器访问任何网站时,幕后实际发生了什么?

我发现非常有帮助的是在我的浏览器中打开一个新选项卡并使用开发人员工具(例如,通过右键单击任意位置,然后单击&#34;检查&#34;)以通过切换到网络标签。访问您选择的网站,例如:wikipedia.org。

现在有很多东西正在发生,但是您对网络通信列表的第一个新条目感兴趣,应该说&#34; www.wikipedia.org&#34;。点击它。

你现在应该看看&#34; Headers&#34;选项卡,特别是请求标头。有两个重要的领域:

  • 请求网址:这告诉服务器您想从中获得什么。它是资源定位器,这意味着您要从服务器访问资源,例如,您在应用程序中使用的HTML,图像或原始JSON数据。
  • 请求方法:这告诉服务器您要对要尝试访问的资源执行的操作。你想 GET 吗?或者您想 PUT 服务器上的某些资源?您可能希望删除 POST 对此资源进行更改。

让我们回到您的源代码。

您在上面提供的是模型类和控制器类。

您的模型是表示Web应用程序中的资源的数据结构。 Id,Name,Timestamp,Date是此资源的属性。根据您的实际用例,您希望创建,使用,更新或删除此模型类型的对象,并决定其属性的值。

为了让您的客户这样做,您有一个控制器类。它是所有网络请求的入口点,&#34; map&#34;致:

[Route("api/[controller]")]

地图意味着,当您的客户的请求网址(请记住我们的示例&#34; www.wikipedia.org&#34;)与您在Route中定义的字符串匹配时,使用此控制器类(注意:[控制器] ]将被替换为控制器类的实际名称,在本例中为&#34; Webservice&#34;。

在您的控制器中,您可以定义操作。根据客户端请求的请求URL和请求方法(见上文),您的Web框架决定调用哪个操作。

[HttpGet]

这映射到URL api/Webservice的GET请求。动作的返回类型是List,这意味着应该返回多个对象。在您的情况下,当客户端访问api/Webservice时,将返回_context.Webservice中的所有对象。

[HttpGet("{id}")]

这也映射到GET请求,但这次需要一个所谓的查询参数。这是客户提供的另一条信息,可以使其请求更具体。例如,他们可能会请求api/Webservice?id=1,要求您返回ID为1的对象。

[HttpPost]

这会映射到POST请求,并要求您插入或更新对象。 [FromBody]告诉请求处理器将所谓的 Request Body 转换为给定类型的对象。请求正文是您的客户将放置整个对象的地方 - 例如转换为以JSON格式 - 他们想要提交给服务器。

现在,我希望这会让您的代码示例更加清晰。您还提到了查看,因此我将快速解释它是什么:通常,在向服务器发出请求后,您会回复某些答案。在最简单的情况下,响应状态告诉客户端一切顺利。对于GET请求,您通常会在响应正文中返回一个对象。您返回的内容称为视图。在您的示例中:

return Ok(reading);

将从数据库中检索到的对象转换为机器可读格式(例如JSON)并添加响应状态&#34; 200 OK&#34;它。这将发送给您的客户。

因此,这应该可以让您对Web框架的工作方式有一个很好的了解。我希望我可以帮助你这个相当长的阅读。如果我能澄清任何事情,请告诉我。

答案 1 :(得分:0)

模型:它基本上是数据库的表结构。因此,无论何时创建对象并设置值并在数据库中插入对象。 控制器:它用于处理HTTP调用并将业务逻辑与View链接。

  

[HTTPGET]

这映射到URL api / Webservice的GET请求,没有任何查询参数。动作返回类型是List,这意味着应该返回多个对象。在您的情况下,当客户端访问api / Webservice时,将返回_context.Webservice中的所有对象。

  

[HTTPGET( “(编号)”)]

这也映射到GET请求,但这次它需要一个所谓的查询参数。这是客户提供的另一条信息,可以使其请求更具体。例如,他们可能会请求api / Webservice?id = 1,它会要求您返回id为1的对象。

  

[HttpPost]

这会映射到POST请求,并要求您插入或更新对象。 [FromBody]告诉请求处理器将所谓的Request Body转换为给定类型的对象。请求正文是您的客户将放置整个对象的地方 - 例如转换为以JSON格式 - 他们想要提交给服务器。 所以,对于模型

public class SecondlyReading {
        [Key]
        public int Id { get; set; }
        [Required]
        public int Name { get; set; }
        [Required]
        public string TimeStamp { get; set; }
        [Required]
        public string Date { get; set; }
    }

这将创建一个以Id作为主键的数据表,因为您使用的是[Key]属性。

private ApplicationDbContext _context;

这用于创建数据库上下文。您可能还在 ApplicationDbContext

中创建了以下内容
public DbSet<SecondlyReading> WebService{get; set;}

它将创建一个名为WebService的DbSet。

在WEB API中, POST 用于插入新数据。所以,这里是API 的 API / web服务 在POST中,将用于插入数据。您可以使用任何CLIENT(如POSTMAN或ARC)插入数据。您必须在HTTP调用的请求主体中设置数据。 API的响应可以是JSON或XML,具体取决于您的输出。

答案 2 :(得分:0)

我认为阅读基础知识会更好吗?因此,您将了解Web API的正常运行方式 自我阅读 https://www.asp.net/web-api