浅谈WebService\WebApi\WCF三种接口的基本应用

什么是webservice?

什么是webservice?

webservice是一个平台独立的、低耦合的、自包含的、基于可编程的Web应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。

Webservice技术能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件就可相互交换数据或集成。

创建一个WebService并调用

 public class MyWebService : System.Web.Services.WebService
    {
        /// <summary>
        /// 乘法运算
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <returns></returns>
        [WebMethod(Description = "乘法运算(计算两个数相乘的结果)")]
        public int Multiplier(int a, int b)
        {
            return a * b;
        }
    }

在这里插入图片描述
在这里插入图片描述

http://localhost:20914/MyWebService.asmx 调用地址

如果想要别人也能访问到,我们需要把这个Web服务发布到IIS上面。选中MyWebService.asmx 在浏览器中查看。
在项目中添加引用:在这里插入图片描述
选中项目添加新项-web窗体,命名为webform1。Webform1.aspx页面代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebAppService.WebForm1" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
        <asp:TextBox ID="txtA" runat="server"></asp:TextBox>
        *<asp:TextBox ID="txtB" runat="server"></asp:TextBox>
        <asp:Button ID="btnGetResult" runat="server" Text="=" OnClick="btnGetResult_Click" /><asp:TextBox ID="txtResult" runat="server"></asp:TextBox>
        </div>
    </form>
</body>
</html>
在这里插入代码片

webform1后台代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebAppService
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnGetResult_Click(object sender, EventArgs e)
        {
            ServiceRef.MyWebServiceSoapClient _client = new ServiceRef.MyWebServiceSoapClient();
            txtResult.Text = _client.Multiplier(int.Parse(txtA.Text.Trim()), int.Parse(txtB.Text.Trim())).ToString();
        }
    }
}这里插入代码片

运行项目:在这里插入图片描述
为了方便统一把web服务寄宿在IIS上,项目中我们一般会把所有web服务放到一个为web站点,发布到IIS上共用户调用。

什么是WebApi?

WebApi可以返回Json、Xml类型的数据,对于数据的增删改查提供对应的资源操作,按照请求的类型进行相应的处理。,主要包括Get(查),Post(增),Put(改)、Delete(删),这些都是Http协议支持的请求方式。

创建WebApi
新建项目Web-ASP.NET MVC 应用程序。命名位WebApiApp,在项目模板中选中Web Api。

在Models类中新建类Product。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace WebApiApp.Models
{
    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Category { get; set; }
        public decimal Price { get; set; }
    }
}

新建Api控制器Products,右击目录Controllers,添加控制器。和普通控制不一样,这里要继承ApiController。如图:

using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using WebApiApp.Models;

namespace WebApiApp.Controllers
{
    public class ProductsController : ApiController
    {
        Product[] products = new Product[] 
        { 
            new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 }, 
            new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M }, 
            new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M } 
        };

        public IEnumerable<Product> GetAllProducts()
        {
            return products;
        }

        public Product GetProduct(int id)
        {
            var product = products.FirstOrDefault((p) => p.Id == id);
            return product;
        }
    }
}

调用WebApi:
有两种调用方式
1.JQuery Ajax (可以网上去查)
2.HttpClient(第二种重点)
新建MVC项目WebApiClient
ModelS文件下创建Product类 添加程序集引用WepApi达到公用。
添加Home控制器和Index的Action方法。

using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Web.Mvc;
using WebApiClient.Models;

namespace WebApiClient.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            //客户端对象的创建与初始化
            HttpClient client = new HttpClient();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            //执行Get操作
            HttpResponseMessage response = client.GetAsync("http://localhost:16947/api/Products").Result;
            var list = response.Content.ReadAsAsync<List<Product>>().Result;
            ViewData.Model = list;

            return View();
        }
    }
}

index界面:

在这里插@{
    ViewBag.Title = "Index";
}
@model List<WebApiClient.Models.Product>
<ul>
@foreach (var v in Model)
{
    <li>@v.Id","@v.Name,@v.Price</li>
}
</ul>入代码片

注意一点更要先云翔WebApiApp,在云香WebApiClient.

WebApi 授权:
只对指定给客户开户。开发中比较常用也是难点。类似于授权验证。
新建过滤器类APIAuthorizeAttribute在WebApiApp项目中filter文件下:

在这using System;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading;
using System.Web.Http.Filters;

namespace WebApiApp.Filter
{
    public class APIAuthorizeAttribute : AuthorizationFilterAttribute
    {
        public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            //如果用户使用了forms authentication,就不必在做basic authentication了
            if (Thread.CurrentPrincipal.Identity.IsAuthenticated)
            {
                return;
            }

            var authHeader = actionContext.Request.Headers.Authorization;

            if (authHeader != null)
            {
                if (authHeader.Scheme.Equals("basic", StringComparison.OrdinalIgnoreCase) &&
                    !String.IsNullOrWhiteSpace(authHeader.Parameter))
                {
                    var credArray = GetCredentials(authHeader);
                    var userName = credArray[0];
                    var key = credArray[1];
                    string ip = System.Web.HttpContext.Current.Request.UserHostAddress;
                   
                }
            }

            HandleUnauthorizedRequest(actionContext);
        }

        private string[] GetCredentials(System.Net.Http.Headers.AuthenticationHeaderValue authHeader)
        {

            //Base 64 encoded string
            var rawCred = authHeader.Parameter;
            var encoding = Encoding.GetEncoding("iso-8859-1");
            var cred = encoding.GetString(Convert.FromBase64String(rawCred));

            var credArray = cred.Split(':');

            return credArray;
        }

        private bool IsResourceOwner(string userName, System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            var routeData = actionContext.Request.GetRouteData();
            var resourceUserName = routeData.Values["userName"] as string;

            if (resourceUserName == userName)
            {
                return true;
            }
            return false;
        }

        private void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);

            actionContext.Response.Headers.Add("WWW-Authenticate",
                                               "Basic Scheme='eLearning' location='http://localhost:8323/APITest'");

        }
    }
}

把这个过滤器添加到全局过滤器中,不要添加到filterconfig.cs中(仅MVC用),而是webApiconfig.cs(webapi用)。App_start文件下:

using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using WebApiApp.Filter;

namespace WebApiApp
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
            config.Filters.Add(new APIAuthorizeAttribute()); //添加授权验证过滤器
        }
    }
}

WebApi调试
个人用PostMan调试,其余方式可以自己百度 (偷个懒,哈哈!) 写了两天。
天色不早了 ,毕竟快一点了 ,明天继续最后的WCF,这个比较复杂点 ,大家晚安!

写在最后

处女作首秀,工作了块两年多C#程序员,说来有点惭愧,一直主要做业余偏多,忽视很多重要的知识点,自己加强,给自己定一个计划,每周至少一个博客,以后也尽力在git上开源一下小项目,督促自己成长。不在迷茫,更进一步!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值