webapi对象不支持属性或方法_webapi 忽略属性 - CSDN
精华内容
参与话题
  • vs2017开发web api 应用学习笔记

    千次阅读 2018-12-12 15:18:15
    参考网址:...在vs2017中选择新建项目-选择asp.net web 应用程序,在如下图示项目选择窗口中,选择“空“项目,勾选 Web Api,确定后系统自动创建空的Web Api项目; 二、设置路由 默...

    参考网址:https://www.cnblogs.com/landeanfen/p/5337072.html,该文章对接口属性以及接口参数的传递有比较详细的描述。

    一、新建web api 项目

    在vs2017中选择新建项目-选择asp.net  web 应用程序,在如下图示项目选择窗口中,选择“空“项目,勾选 Web Api,确定后系统自动创建空的Web Api项目;

    二、设置路由

    默认情况下创建的Web Api 项目采用"api/{controller}/{id}" 的方式映射访问路由,即:api为默认路径前缀,controller对应为控制器名称中去掉controller中的部分,而接口名称采用get前缀的方法,即访问接口的method采用get,其它的依次类推,访问接口非常的机械且难以理解,可在控制器中使用RoutePrefix属性重新定义控制对应的访问路径名称,在方法中使用Route属性映射方法的访问路径,使用HttpGet等属性映射方法的访问method,这样可提高整个应用的灵活性和规范性;

    三、在web api中启用会话支持

    web api默认情况并不支持会话,通过 HttpContext.Current.Session访问相关会话对象时,总是为null,需要使用以下方法启用会话支持:

    重写global.asax对象对的  Init() 方法,示例代码如下:
        

     public override void Init()
            {
                //=======================启用会话=============================
                this.PostAuthenticateRequest += (sender, e) => HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
                base.Init();
            }

    四、对接口启用访问认证

    新建RequestAuthorizeAttribute类,该类继承至AuthorizeAttribute,重写父类的OnAuthorization方法;在需要验证的接口方法中使用RequestAuthorizeAttribute属性,RequestAuthorizeAttribute代码如下:

     public class RequestAuthorizeAttribute : AuthorizeAttribute
        {
            public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
            {
                //从http请求的头里面获取身份验证信息,验证是否是请求发起方的ticket
                var authorization = actionContext.Request.Headers.Authorization;
                if ((authorization != null) && (authorization.Parameter != null))
                {
                    //解密用户ticket,并校验用户名密码是否匹配
                    var encryptTicket = authorization.Parameter;
                    if (ValidateTicket(encryptTicket))
                    {
                        base.IsAuthorized(actionContext);
                    }
                    else
                    {
                        HandleUnauthorizedRequest(actionContext);
                    }
                }
                //如果取不到身份验证信息,并且不允许匿名访问,则返回未验证401
                else
                {
                    var attributes = actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().OfType<AllowAnonymousAttribute>();
                    bool isAnonymous = attributes.Any(a => a is AllowAnonymousAttribute);
                    if (isAnonymous) base.OnAuthorization(actionContext);
                    else HandleUnauthorizedRequest(actionContext);
                }
            }
    
            //校验用户名密码(正式环境中应该是数据库校验)
            private bool ValidateTicket(string encryptTicket)
            {
                //解密Ticket
                var strTicket = FormsAuthentication.Decrypt(encryptTicket).UserData;
    
                //从Ticket里面获取用户名和密码
                var index = strTicket.IndexOf("&");
                string strUser = strTicket.Substring(0, index);
                string strPwd = strTicket.Substring(index + 1);
    
                if (strUser == "test" && strPwd == "123456")
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }

    接口启用验证的示例代码如下:

            [HttpPut]
            [RequestAuthorize]
            [Route("update/{id}")]
            public LoginToken update(string id,[FromBody] Logins login)
            {
                System.Diagnostics.Debug.WriteLine(login);
    
                LoginToken token = new LoginToken { token = "1111111111", userId = "test", userName = "test" };
                return token;
            }

    五、webApi接口参数

    1、接口调用方式:webap有put、get、delete、post等集中调用方式,在未显示说明接口调用方式属性时,对Get开始的方法默认为采用get方式(post、put、delete类似),若接口方法默认不符合约定,则需要使用属性明确说明;

    2、对get方法可适用[Fromuri] 参数,说明接口参数来自于url,而post、put、delete方法可采用[frombody]属性将来自于http数据部分的数据序列化为指定对的对象的类型,当不明确来自于数据部分的对象类型,对接口参数采用dynamic类型是不错的选择,示例如下:

    前端提交的数据内容:

       $.ajax({
            type: "post",
            url: "http://localhost:27221/api/Charging/SaveData",
            contentType: 'application/json',
            data: JSON.stringify({ NAME: "Jim",DES:"备注" }),
            success: function (data, status) {}
        });

    后端数据接口:

            [HttpPost]
            public object SaveData(dynamic obj)
            {
                var strName = Convert.ToString(obj.NAME);
                return strName;
            }

    需要注意的是:若需要dynamic对象直接序列化为对象,需要在前端提交数据的时候,将数据用JSON.stringfy(data)序列化为json对象,否则后端得到的是层层嵌套的对象;

    3、接口采用对象,如下示例接口:

    [HttpPost]
            public bool SaveData(TB_CHARGING oData)
            {
                return true;
            }

    同上:明确采用json格式进行数据传递时,需要用JSON.stringfy(data)序列化为json对象

    对接口传递数组对象时,可采用List<ObjectType>的类型传递接口参数,示例如下:

     [HttpPost]
            public bool SaveData(List<TB_CHARGING> lstCharging)
            {
                return true;
            }

    六、利用webApi上传文件

    前端需要content-type信息为:

    "Content-Type":"multipart/form-data"

    后端代码如下示例:

    HttpRequest httpRequest = HttpContext.Current.Request;
                foreach (string file in httpRequest.Files)
                {
                    System.Diagnostics.Debug.WriteLine(httpRequest.Files[file].FileName);
                    System.IO.Stream inStream = httpRequest.Files[file].InputStream;
                    byte[] buffer = new byte[inStream.Length];
                    inStream.Read(buffer, 0, buffer.Length);
                    
                    var filePath = HttpContext.Current.Server.MapPath("~/" + httpRequest.Files[file].FileName);
                    httpRequest.Files[file].SaveAs(filePath);
                }

     

    展开全文
  • vSphere API 是作为一种语言无关的 Web 服务实现的,它基于一个远程过程调用机制,客户端应用程序使用它来访问 ESXi和 vCenter 服务器系统上的服务和组件。本章节主要包括以下内容: ■ vSphere Client-Server 架构 ...

    vSphere API 编程模型(一)


    vSphere API 是作为一种语言无关的 Web 服务实现的,它基于一个远程过程调用机制,客户端应用程序使用它来访问 ESXi和 vCenter 服务器系统上的服务和组件。


    本章节主要包括以下内容:

    ■ vSphere Client-Server 架构
    ■ vSphere API 作为一个 Web 服务
    访问托管对象(Managed Object)
    访问 vSphere 服务器数据

    1. vSphere Client-Server 架构

    VMware vSphere 客户端应用程序加入了使用异步通信模型的分布式架构。
    该架构是基于服务器端托管对象、客户端托管对象引用和数据对象的。

    ■ 托管对象(Managed objects),存在于 vSphere 服务器(ESX/ESXi 或 vCenter 服务器系统)上,表示 vSphere 服务和组件:

    服务包括 PropertyCollector、SearchIndex、PerformanceManager 和 ViewManager;

    组件包括清单对象如VirtualMachine、Datastore、Folder。

    ■ 托管对象引用(Managed object references),是客户端应用到服务器端托管对象的引用。
    当你的客户端应用调用一个服务器上的操作(方法)时,客户端就会使用 ManagedObjectReference 对象。
    在一个对象的生命周期中,一个 ManagedObjectReference 保证是唯一的和持久的。当对象随着清单被移除、跨会话和跨服务器重启时,引用仍然存在。
    如果你移除一个对象,如清单中的虚拟机,然后把它迁移回去,此时引用就改变了。

    ■ 数据对象(Data objects ),包含托管对象的相关信息。你的客户端应用发送数据对象到 vSphere 服务器,并从服务器接收数据对象。
    示例是不同的规范和功能对象,例如 virtualmachine econfigspec 和 HostCapability。

    下图的 vSphere Server and Client 关系图中展示了一个 vSphere 服务器和客户端应用, 客户端有一个托管对象引用到服务器上的虚拟机,以及一个用于虚拟机的 GuestInfo 数据对象的副本。

    vSphere Server and Client

    这里写图片描述

    客户机必须维护数据对象的副本,因为根据客户机请求的类型,vSphere 服务器可能会将数据对象的属性数据作为一组与托管理对象引用关联的名称-值对进行发送。

    请参阅 vSphere API Reference 中的 ObjectContent 数据对象的描述。

    在大多数情况下,VMware vSphere 应用程序模型使用一个异步的客户机-服务器通信模型。方法是非阻塞的,并返回一个对任务管理对象的引用。可参阅 任务和调度任务

    2. vSphere API 作为一个 Web 服务

    vSphere API 符合 Web服务互操作性组织(WS-I)基本概要1.0
    WS-I 基本概要文件 1.0 支持:
    ■ XML Schema 1.0
    ■ SOAP 1.1
    ■ WSDL 1.1

    Web 服务支持操作,此操作与其他编程语言中的方法是一样的。vSphere API Web service 提供了对监控和管理 vSphere 组件所需的 所有操作的访问,如 compute resources、 virtual machines、networks、storage 等等。

    2.1 WSDL 文件和客户端代理接口

    vSphere Web Services SDK 提供了一系列 WSDL (Web Services Description Language, Web 服务描述语言)文件来定义vSphere Web Services API。Web-services 开发工具如 JAX-WS wsimport,或者 Microsoft .NET wsdl.exe 使用这些 WSDL 文件 生成客户端代理代码 (存根)。

    客户端代理提供特定于语言的vSphere API,如 Java 或 C#。代理方便了远程方法调用、对象数据的组织以及分布式、面向对象、应用程序编程等其他方面。而你的客户端应用只需调用代理接口方法,客户端代理使用 SOAP (Simple Object Access Protocol,简单对象访问协议)与一个 vSphere 服务器交换 WSDL 消息。

    下图是一个客户端应用程序使用客户端代理接口来调用方法的示意图,客户端代理接口使基于 WSDL 定义的。

    Client-Server 通过客户端代理接口通信图

    这里写图片描述

    要使用 VMware 客户端代理接口,必须使用以下 Java 和 C# 语句将 vSphere API 客户端库导入到客户机应用程序中。

    C#          using VimApi;
    Java        import com.vmware.vim25.*;
    

    重要: vSphere Web Services SDK 包含了使用 JAX-WS 工具生成的 Java 客户端代理代码,如果你的开发平台上的 Java 和 JAX-WS 版本与用于 SDK 中生成代理接口的版本相同,那么你就不必从 WSDL 生成客户端代理代码。有关为 vSphere Web Services SDK配置开发环境的信息,请参见开发人员的设置指南。


    2.2 网络访问 vSphere Web Service

    客户端应用程序可以使用 vSphere API 和 vSphere 服务器在 443 端口上通过 HTTPS 协议进行通信, HTTPS 是默认协议,当然也可以通过配置服务器支持 HTTP 协议。

    使用 HTTP 访问只用于测试或开发环境中,而不用于生产环境。有关详细信息,请参阅开发人员设置指南。

    2.3 特定语言的类文件和方法

    SOAP 工具生成与 WSDL 定义相匹配的特定于语言的类和方法,这些工具还可以生成不在 WSDL 文件中的对象和方法。

    ■ 生成的对象, 附加的对象提供对 vSphere Web 服务的访问,以建立客户机-服务器连接( VimServiceLocator、AppUtil ),并声明为vSphere API (VimPortType、VimService) 定义的方法。

    ■ 生成的方法,附加的方法是属性的获取(getter)和设置(setter)方法。对于 Java 来说,方法名称是对属性名加上 get 和 set 前缀来构建的,其中属性名的首字母改为大写。

    下表的客户端代理定义明确了为 vSphere Web Services SDK WSDL 客户端代理定义。

    客户端代理定义

    这里写图片描述

    下面的代码片段显示了 AfterStartupTaskScheduler 中 minute 属性的 getter 和 setter方法声明。

    Java
    public int getMinute() {
        return minute;
    }
    public void setMinute(int minute) {
        this.minute = minute; 
    }
    
    C#
    public int minute {
        set; 
        get; 
    }

    你可以通过 vSphere API 引用来推断客户端代理接口中可用的getter和setter方法。
    例如:ScsiLun 数据对象有一个 displayName 属性,对于 Java API,可以使用 setDisplayName( ) 方法为属性赋值,使用 getDisplayName( ) 获取属性值,vSphere Web Services SDK 包含 Java 和 C# 的示例代码说明了代理接口的使用方法。可查阅 客户端应用程序

    2.4 映射 XML 数据类型到 Java 和 C# 数据类型

    在这本指南中,UML 类图和对象图使用了诸如字符串和整数之类的原始数据类型名称,而没有 XML 模式定义名称空间前缀(xsd:)。
    vSphere API 引用包含了完整的数据类型名称,如 xsd:string。数据类型映射到客户机应用程序使用的编程语言对应的原始数据类型。

    下表列出了一些常用的 XML 原始数据类型映射。
    标准 XML 模式原始数据类型到 Java 和 .NET 数据类型的映射

    这里写图片描述




    原文:
    VMware vSphere 6.5 Documentation Center:vSphere API Programming Model

    展开全文
  • (精华)2020年9月22日 微服务 WebAPI详解

    万次阅读 2020-09-22 22:59:20
    if (!(Test-Path -Path $PROFILE)) { New-Item -ItemType File -Path $PROFILE -Force }

    webapi

    就是使用asp.net core使用c#创建Restful服务,就是webapi,如果要使用webapi控制器

    webapi中的控制器是派生自ControllerBase的类,

    ControllerBase类

    不要通过从 Controller 类派生来创建 Web API 控制器。 Controller 派生自 ControllerBase,并添加对视图的支持,因此它用于处理 Web 页面,而不是 Web API 请求。 此规则有一个例外:如果打算为视图和 Web API 使用相同的控制器,则从 Controller 派生控制器。

    ControllerBase 类提供了很多用于处理 HTTP 请求的属性和方法。

    例如,ControllerBase.CreatedAtAction 返回 201 状态代码:

    下面是 ControllerBase 提供的方法的更多示例。

    方法 说明
    BadRequest 返回 400 状态代码。
    NotFound 返回 404 状态代码。
    PhysicalFile 返回文件。
    TryUpdateModelAsync 调用模型绑定
    TryValidateModel 调用模型验证

    特性

    Microsoft.AspNetCore.Mvc 命名空间提供可用于配置 Web API 控制器的行为和操作方法的属性。 下述示例使用属性来指定受支持的 HTTP 操作动作和所有可返回的已知 HTTP 状态代码:

    [HttpPost][ProducesResponseType(StatusCodes.Status201Created)]
    [ProducesResponseType(StatusCodes.Status400BadRequest)]
    public ActionResult<Pet> Create(Pet pet)
    {
    pet.Id = _petsInMemoryStore.Any() ? 
    _petsInMemoryStore.Max(p => p.Id) + 1 : 1;
    _petsInMemoryStore.Add(pet);
    return CreatedAtAction(nameof(GetById), new { id = pet.Id }, pet);
    }
    
    特性 说明
    [[Route\]] 指定控制器或操作的 URL 模式。
    [[Bind\]] 指定要包含的前缀和属性,以进行模型绑定。
    [[HttpGet\]] 标识支持 HTTP GET 操作谓词的操作。
    [[Consumes\]] 指定某个操作接受的数据类型。
    [[Produces\]] 指定某个操作返回的数据类型。

    ApiController特性

    特定控制器上特性

    [[ApiController\]]属性可应用于控制器类,以启用下述 API 特定的固定行为:

    必须有兼容性版本 2.2 或更高版本,才能使用“错误状态代码的问题详细信息” 功能。 必须有兼容性版本 2.1 或更高版本,才能使用其他功能。

    多个控制器上的特性

    在多个控制器上使用该属性的一种方法是创建通过 [ApiController] 属性批注的自定义基控制器类。 下述示例展示了自定义基类以及从其派生的控制器:

    [ApiController]
    public class MyControllerBase : ControllerBase
    {
    }
    
    [Produces(MediaTypeNames.Application.Json)]
    [Route("[controller]")]
    public class PetsController : MyControllerBase
    

    程序集上特性

    如果将兼容性版本设置为 2.2 或更高版本,则 [ApiController] 属性可应用于程序集。 以这种方式进行注释,会将 web API 行为应用到程序集中的所有控制器。 无法针对单个控制器执行选择退出操作。 将程序集级别的属性应用于 Startup 类两侧的命名空间声明:

    [assembly: ApiController]
    namespace WebApiSample
    {
        public class Startup
        {
            ...
        }
    }
    

    特性路由要求

    [ApiController] 属性使属性路由成为要求。 例如:

    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    

    不能通过由 Startup.Configure 中的 UseEndpointsUseMvcUseMvcWithDefaultRoute 定义的传统路由访问操作。

    自动http 400响应

    [ApiController] 属性使模型验证错误自动触发 HTTP 400 响应。 因此,操作方法中不需要以下代码:

    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    

    ASP.NET Core MVC 使用 ModelStateInvalidFilter 操作筛选器来执行上述检查。

    默认 BadRequest 响应

    使用 2.1 的兼容性版本时,HTTP 400 响应的默认响应类型为 SerializableError。 下述请求正文是序列化类型的示例:

    JSON

    {
      "": [
        "A non-empty request body is required."
      ]
    }
    

    使用 2.2 或更高版本的兼容性版本时,HTTP 400 响应的默认响应类型为 ValidationProblemDetails。 下述请求正文是序列化类型的示例:

    JSON

    {
      "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
      "title": "One or more validation errors occurred.",
      "status": 400,
      "traceId": "|7fb5e16a-4c8f23bbfc974667.",
      "errors": {
        "": [
          "A non-empty request body is required."
        ]
      }
    }
    

    ValidationProblemDetails 类型:

    • 提供计算机可读的格式来指定 Web API 响应中的错误。
    • 符合 RFC 7807 规范

    记录自动 400 响应

    请参阅如何对模型验证错误记录自动 400 响应 (aspnet/AspNetCore.Docs #12157)

    禁用自动 400 响应

    若要禁用自动 400 行为,请将 SuppressModelStateInvalidFilter 属性设置为 true。 将以下突出显示的代码添加到 Startup.ConfigureServices

    services.AddControllers()
        .ConfigureApiBehaviorOptions(options =>
        {
            options.SuppressConsumesConstraintForFormFileParameters = true;
            options.SuppressInferBindingSourcesForParameters = true;
            options.SuppressModelStateInvalidFilter = true;
            options.SuppressMapClientErrors = true;
            options.ClientErrorMapping[404].Link =
                "https://httpstatuses.com/404";
        });
    

    绑定源参数推理

    绑定源特性定义可找到操作参数值的位置。 存在以下绑定源特性:

    特性 绑定源
    [[FromBody\]] 请求正文
    [[FromForm\]] 请求正文中的表单数据
    [[FromHeader\]] 请求标头
    [[FromQuery\]] 请求查询字符串参数
    [[FromRoute\]] 当前请求中的路由数据
    [[FromServices\]] 作为操作参数插入的请求服务

    如果没有 [ApiController] 属性或诸如 [FromQuery] 的绑定源属性,ASP.NET Core 运行时会尝试使用复杂对象模型绑定器。 复杂对象模型绑定器按已定义顺序从值提供程序拉取数据。

    在下面的示例中,[FromQuery] 特性指示 discontinuedOnly 参数值在请求 URL 的查询字符串中提供:

    [HttpGet]
    public ActionResult<List<Product>> Get(
        [FromQuery] bool discontinuedOnly = false)
    {
        List<Product> products = null;
    
        if (discontinuedOnly)
        {
            products = _productsInMemoryStore.Where(p => p.IsDiscontinued).ToList();
        }
        else
        {
            products = _productsInMemoryStore;
        }
    
        return products;
    }
    

    [ApiController] 属性将推理规则应用于操作参数的默认数据源。 借助这些规则,无需通过将属性应用于操作参数来手动识别绑定源。 绑定源推理规则的行为如下:

    • [FromBody] 针对复杂类型参数进行推断。 [FromBody] 不适用于具有特殊含义的任何复杂的内置类型,如 IFormCollectionCancellationToken。 绑定源推理代码将忽略这些特殊类型。
    • [FromForm] 针对 IFormFileIFormFileCollection 类型的操作参数进行推断。 该特性不针对任何简单类型或用户定义类型进行推断。
    • [FromRoute] 针对与路由模板中的参数相匹配的任何操作参数名称进行推断。 当多个路由与一个操作参数匹配时,任何路由值都视为 [FromRoute]
    • [FromQuery] 针对任何其他操作参数进行推断。

    FromBody 推理说明

    对于简单类型(例如 stringint),推断不出 [FromBody]。 因此,如果需要该功能,对于简单类型,应使用 [FromBody] 属性。

    当操作拥有多个从请求正文中绑定的参数时,将会引发异常。 例如,以下所有操作方法签名都会导致异常:

    • [FromBody] 对两者进行推断,因为它们是复杂类型。

      [HttpPost]
      public IActionResult Action1(Product product, Order order)
      
    • [FromBody] 对一个进行归属,对另一个进行推断,因为它是复杂类型。

      [HttpPost]
      public IActionResult Action2(Product product, [FromBody] Order order)
      
    • [FromBody] 对两者进行归属。

      [HttpPost]
      public IActionResult Action3([FromBody] Product product, [FromBody] Order o
      

    禁用推理规则

    若要禁用绑定源推理,请将 SuppressInferBindingSourcesForParameters 设置为 true。在 Startup.ConfigureServices 中添加下列代码:

    services.AddControllers()
        .ConfigureApiBehaviorOptions(options =>
        {
            options.SuppressConsumesConstraintForFormFileParameters = true;
            options.SuppressInferBindingSourcesForParameters = true;
            options.SuppressModelStateInvalidFilter = true;
            options.SuppressMapClientErrors = true;
            options.ClientErrorMapping[404].Link =
                "https://httpstatuses.com/404";
        });
    

    Multipart/form-data 请求推理

    使用 [FromForm\] 属性批注操作参数时,[ApiController] 属性应用推理规则。 将推断 multipart/form-data 请求内容类型。

    要禁用默认行为,请在 Startup.ConfigureServices 中将 SuppressConsumesConstraintForFormFileParameters 属性设置为 true

    services.AddControllers()
        .ConfigureApiBehaviorOptions(options =>
        {
            options.SuppressConsumesConstraintForFormFileParameters = true;
            options.SuppressInferBindingSourcesForParameters = true;
            options.SuppressModelStateInvalidFilter = true;
            options.SuppressMapClientErrors = true;
            options.ClientErrorMapping[404].Link =
                "https://httpstatuses.com/404";
        });
    

    错误状态代码的问题详细信息

    禁用 ProblemDetails 响应

    SuppressMapClientErrors 属性设置为 true 时,会禁止自动创建错误状态代码的 ProblemDetails。 在 Startup.ConfigureServices 中添加下列代码:

    services.AddControllers()
        .ConfigureApiBehaviorOptions(options =>
        {
            options.SuppressConsumesConstraintForFormFileParameters = true;
            options.SuppressInferBindingSourcesForParameters = true;
            options.SuppressModelStateInvalidFilter = true;
            options.SuppressMapClientErrors = true;
            options.ClientErrorMapping[404].Link =
                "https://httpstatuses.com/404";
        });
    

    使用 [Consumes] 属性定义支持的请求内容类型

    默认情况下,操作支持所有可用的请求内容类型。 例如,如果应用配置为同时支持 JSON 和 XML 输入格式化程序,那么操作支持多种内容类型,其中包括 application/jsonapplication/xml

    使用 [Consumes] 属性,操作可以限制支持的请求内容类型。 将 [Consumes] 属性应用于操作或控制器,同时指定一个或多个内容类型:

    [HttpPost]
    [Consumes("application/xml")]
    public IActionResult CreateProduct(Product product)
    

    在上面的代码中,CreateProduct 操作指定内容类型 application/xml。 路由到此操作的请求必须指定 application/xmlContent-Type 头。 如果请求未指定 application/xmlContent-Type 头,会生成 415 不支持的媒体类型响应。

    使用 [Consumes] 属性,操作可以通过应用类型约束,根据传入请求的内容类型来影响它的选择。 请看下面的示例:

    [ApiController]
    [Route("api/[controller]")]
    public class ConsumesController : ControllerBase
    {
        [HttpPost]
        [Consumes("application/json")]
        public IActionResult PostJson(IEnumerable<int> values) =>
            Ok(new { Consumes = "application/json", Values = values });
    
        [HttpPost]
        [Consumes("application/x-www-form-urlencoded")]
        public IActionResult PostForm([FromForm] IEnumerable<int> values) =>
            Ok(new { Consumes = "application/x-www-form-urlencoded", Values = values });
    }
    

    在上面的代码中,ConsumesController 配置为处理发送到 https://localhost:5001/api/Consumes URL 的请求。 控制器的两个操作(PostJsonPostForm)都使用相同的 URL 处理 POST 请求。 如果 [Consumes] 属性不应用类型约束,则会抛出不明确匹配异常。

    [Consumes] 属性应用于两个操作。 PostJson 操作处理使用 application/jsonContent-Type 头发送的请求。 PostForm 操作处理使用 application/x-www-form-urlencodedContent-Type 头发送的请求。

    展开全文
  • MVC和Web API 过滤器Filter

    千次阅读 2016-05-11 10:42:09
    MVC和Web API Filter(过滤器) ...和做出关于是否执行操作方法(如执行身份验证验证请求的属性)的安全决策。AuthorizeAttribute 类和RequireHttpsAttribute类是授权筛选器的示例。授权筛选器在任何其他筛选

    MVCWeb API Filter(过滤器)

    ASP.NET MVC 支持以下类型的操作筛选器:

    ·        授权筛选器。这些筛选器用于实现IAuthorizationFilter和做出关于是否执行操作方法(如执行身份验证或验证请求的属性)的安全决策。AuthorizeAttribute类和RequireHttpsAttribute类是授权筛选器的示例。授权筛选器在任何其他筛选器之前运行。

    ·        操作筛选器。这些筛选器用于实现IActionFilter以及包装操作方法执行。IActionFilter接口声明两个方法:OnActionExecutingOnActionExecutedOnActionExecuting在操作方法之前运行。OnActionExecuted在操作方法之后运行,可以执行其他处理,如向操作方法提供额外数据、检查返回值或取消执行操作方法。

    ·        结果筛选器。这些筛选器用于实现IResultFilter以及包装ActionResult对象的执行。IResultFilter声明两个方法:OnResultExecutingOnResultExecutedOnResultExecuting在执行ActionResult对象之前运行。OnResultExecuted在结果之后运行,可以对结果执行其他处理,如修改HTTP响应。OutputCacheAttribute类是结果筛选器的一个示例。

    ·        异常筛选器。这些筛选器用于实现IExceptionFilter,并在ASP.NET MVC管道执行期间引发了未处理的异常时执行。异常筛选器可用于执行诸如日志记录或显示错误页之类的任务。HandleErrorAttribute类是异常筛选器的一个示例。

    不同类型的筛选器

    ASP.NET MVC 框架支持四种不同类型的筛选器:

    1. 授权筛选器 — — 实现的IAuthorizationFilter属性。
    2. 操作筛选器 — — 实现的IActionFilter属性。
    3. 结果筛选器 — — 实现的IResultFilter属性。
    4. 异常筛选器 — — 实现的IExceptionFilter属性。

     

    特别注意:

    MVC中过滤器是system.web.Mvc.dll实现

           实现全局过滤器:App_Start文件夹下的FilterConfig.cs文件中

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)

    {

           //new Test_Mvc.Mvc_Filter()过滤器类的实例对象

          filters.Add(new Test_Mvc.Mvc_Filter());//--注册全局过滤器

    }

     

    Web Api 中过滤器 system.web.http.dll中的system.web.http.Filters实现,添加控制器时一定要注意:一定要选择空的API控制器。如果选择空的MVC控制器那么过滤器对该控制器失效

           实现全局过滤器:Global.asax文件的:

    protected void Application_Start()

    {

        //new Test_Http.Http_Filter()过滤器类的实例对象

        GlobalConfiguration.Configuration.Filters.Add(newTest_Http.Http_Filter());//--注册全局过滤器

    }


    注意:

    using System.Net.Http;
    
    actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, T value);
    

    展开全文
  • Restful api详解和rpc api 区别

    万次阅读 2014-08-18 15:39:19
    什么是REST? REST (REpresentation State Transfer) 描述了一个架构样式的网络系统,比如 web 应用程序。...满足这些约束条件和原则的应用程序设计就是 RESTful。 Web 应用程序最重要的 REST
  • ASP.NET Web API详解

    千次阅读 2014-02-23 11:09:51
    在这篇文章中我们将讨论Web API设计、概念、功能,和对比Web API与WCF。 1. 实现一个Web API项目 我们从一个简单的实例开始讨论。我们使用Visual Studio 2012做为开发环境。我们第一步是基于Web API模版创建...
  • HTML5基础,第3部分:HTML5 API的威力

    万次阅读 2012-09-06 17:32:51
    ... (译者注:由于yeeyan编辑器对文章中的标签做解析的原因,我在每个标签的,我会写成,以便其能够在文章中...应用编程接口(application program interface,API)是访问一个软件应用的编程指令和标准的集合。通过使用
  • Web Api简单使用方法

    千次阅读 2018-04-07 14:54:41
    1. 简单介绍什么是Web ApiREST属于一种设计风格,REST 中的 POST(新增数据),GET(取得数据),PUT(更新数据),DELETE(删除数据)来进行数据库的增删改查,而如果开发人员的应用程式符合REST原则,则它的服务为...
  • 客户端存储 l WEB存储  web存储最初作为html5的一部分被定义成API...Web存储标准所描述的API包含localStorage对象和sessionStorage对象,这两个对象实际上是持久化关联数组,是名值对的映射表。名值都是字符串。 l c
  • H5的新特性及部分API详解

    万次阅读 2016-08-10 13:57:47
    h5新特性总览移除的元素**纯表现的元素:**basefont、big...连通性:能够让你和服务器之间通过创新的新技术方法进行通信(web sockets等)。 离线 & 存储:能够让网页在客户端本地存储数据以及更高效地离线运行(离线
  • 很久前我曾经提到过Web Speech API,现在Chrome刚刚发布的25版本已经为桌面和Android提供了对此API支持,这对Web开发者来说无疑是一个具有里程碑意义的事件,因为我们可以直接在Web App中原生使用语音识别技术,...
  • JSP中application的用法

    万次阅读 2014-07-09 21:53:26
    application对象 1 什么是application对象 ? (1) 当Web服务器启动时,Web... 一个Web服务器通常有多个Web服务目录 (网站),当Web服务器启动时,它自动为每个Web服务目录都创建一个application对象,这些applicati
  • 前言无论是ASP.NET MVC还是Web API框架,在从请求到响应这一过程中对于请求信息的认证以及认证成功过后对于访问页面的授权是极其重要的,用两节来重点来讲述这二者,这一节首先讲述一下关于这二者的一些基本信息,下...
  • webapi开发中,经常会使用multipart/form-data方式来实现文件的上传。而网上流传甚广的就是下面这样一份代码。但是,这份代码有个问题,就是初始化MultipartFormDataStreamProvider类或者子类时,需要制定文件的保存...
  • Servlet规范

    千次阅读 2011-06-02 22:11:00
    也可以说,Servlet是Java组件,部署在Web服务器上,能在请求/响应通信模式下有效地工作。 GenericServlet是独立于协议的Servlet。因此按照需要扩展GenericServlet后也可以实现与协议相关的Se
  • 3D的支持让你可以以更加炫酷的方式展示地理数据,而更加简洁明了的API也不会让你在各种setxxx()和getxxx()方法中傻傻分清楚了。Esri全球开发者峰会中也安排了大量的JavaScript开发专题,怕小伙伴们等不及,小编...
  • ServletContext作用功能详解

    万次阅读 多人点赞 2009-10-13 17:01:00
    ServletContext,是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放。request,一个用户可有多个;session,一个用户一个;...换一种方式说吧,运行在JAVA虚拟机中的每一个Web应用
  • Servlet规范总结

    万次阅读 2016-10-08 10:34:31
    Servlet规范的核心接口即是Servlet接口,它是所有Servlet类必须实现的接口,在Java Servelt API中已经提供了两个抽象类方便开发者实现Servlet类,分别是GenericServlet 和 HttpServlet,GenericServlet定义了一个...
  • (application)javaweb中application的用法

    万次阅读 2015-03-18 21:58:48
    application对象 1 什么是application对象 ? (1) 当Web服务器启动时,Web服务器会自动创建一个application对象。application对象一旦创建,它将一直存在,直到Web服务器关闭。   一个Web服务器通常有多个...
1 2 3 4 5 ... 20
收藏数 166,235
精华内容 66,494
关键字:

webapi对象不支持属性或方法