C# WinForm中提供webapi服务

        云川给我提了一个需求,要我开发一个API服务程序,他来调用,程序再去明道云取数,计算出一个结果返回。网上找到了一篇文章:C# 在Windform程序中搭建Webapi - 小码哥-风云 - 博客园,可以使用微软提供的Microsoft.Owin包来搭建。转载一下,万一原文丢失了呢。

1. 在NuGet引用owin

Microsoft.AspNet.WebApi.Owin
Microsoft.AspNet.WebApi.OwinSelfHost
Microsoft.Owin.StaticFiles

2. 添加服务启动配置类 Startup

using WebapiTest.App_Start;
using Microsoft.Owin.FileSystems;
using Microsoft.Owin.StaticFiles;
using Owin;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Http;

namespace WebapiTest
{
    public class Startup
    {
        public void Configuration(IAppBuilder appBuilder)
        {
            // 创建 Web API 的配置
            var config = new HttpConfiguration();
            // 启用标记路由
            config.MapHttpAttributeRoutes();
            // 默认的 Web API 路由
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            FormatterConfig.Configure(config);
            SwaggerConfig.Register(config);
            FilterConfig.Register(config);

            var physicalFileSystem = new PhysicalFileSystem(@".\Web"); //静态网站根目录
            var options = new FileServerOptions
            {
                EnableDefaultFiles = true,
                FileSystem = physicalFileSystem
            };
            options.StaticFileOptions.FileSystem = physicalFileSystem;
            options.StaticFileOptions.ServeUnknownFileTypes = true;
            options.StaticFileOptions.DefaultContentType = "text/plain";
            options.DefaultFilesOptions.DefaultFileNames = new[] { "Index.html" }; //默认页面(填写与静态网站根目录的相对路径)
            appBuilder.UseFileServer(options);

            // 将路由配置附加到 appBuilder
            appBuilder.UseWebApi(config);
        }
    }
}

3. 添加 Controllers 目录,创建 QueryController Web服务类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Http;

namespace WebapiTest.Controllers
{

        public class QueryController : ApiController
        {
            //// GET api
            //[HttpGet]
            //public IHttpActionResult Json(string id)
            //{
            //    return Json($"hello123:{id}");
            //}

            // GET api
            public string Get(string id)
            {
                return "hello:" + id;
            }
            // POST api
            public string Post([FromBody] string value)
            {
                return value;
            }
            // PUT api
            public void Put(int id, string value)
            {
            }
            // DELETE api
            public void Delete(int id)
            {
            }
        }


}

4. 在程序中调用如下代码启动Web服务

// 打开Web服务
var server = WebApp.Start<Startup>(url: "http://localhost:9099/");

// 停止Web服务
server.Dispose();
server = null;

5. 在生成的文件目录,创建Web文件夹,放入静态Web资源(index.html)

6. 访问Web资源
浏览器访问静态资源 http://localhost:9099/ 
浏览器访问WebApi  http://localhost:9099/api/Query/123

OK。

那我们的程序界面如下:

从这个winform程序再去通过Flurl包去访问其它服务器的api,比如明道云。安装包如下:

全部代码:

Startup.cs

using Microsoft.Owin.FileSystems;
using Microsoft.Owin.StaticFiles;
using Owin;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Http;

namespace mdy2
{
    internal class Startup
    {

        public void Configuration(IAppBuilder appBuilder)
        {
            // 创建 Web API 的配置
            var config = new HttpConfiguration();
            // 启用标记路由
            config.MapHttpAttributeRoutes();
            // 默认的 Web API 路由
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            /*
            var physicalFileSystem = new PhysicalFileSystem(@".\Web"); //静态网站根目录
            var options = new FileServerOptions
            {
                EnableDefaultFiles = true,
                FileSystem = physicalFileSystem
            };
            options.StaticFileOptions.FileSystem = physicalFileSystem;
            options.StaticFileOptions.ServeUnknownFileTypes = true;
            options.StaticFileOptions.DefaultContentType = "text/plain";
            options.DefaultFilesOptions.DefaultFileNames = new[] { "Index.html" }; //默认页面(填写与静态网站根目录的相对路径)
            appBuilder.UseFileServer(options);
            */


            // 将路由配置附加到 appBuilder
            appBuilder.UseWebApi(config);
        }


    }
}

QueryController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Http;
using static System.Net.Mime.MediaTypeNames;

namespace mdy2.Controllers
{
    public class QueryController : ApiController
    {
        //// GET api
        //[HttpGet]
        //public IHttpActionResult Json(string id)
        //{
        //    return Json($"hello123:{id}");
        //}



        // GET api
        public string Get(string id)
        {      

            Task<string> task = Form1.get_mdy_fa(id);     

            return task.Result;
        }

        /*
        // POST api
        public string Post([FromBody] string value)
        {
            return value;
        }



        // PUT api
        public void Put(int id, string value)
        {
        }


        // DELETE api
        public void Delete(int id)
        {
        }

        */

    }
}

Form1.cs

using Flurl.Http;
using Microsoft.Owin.Hosting;
using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Net.Mime.MediaTypeNames;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;

namespace mdy2
{
    public partial class Form1 : Form
    {

        public static Form1 form1; //静态函数中使用UI控件

        public static List<zgd> gdlist = new List<zgd>();           //工单表
        public static List<cl> cllist = new List<cl>();             //处理方式
        public static List<clren> clrenlist = new List<clren>();    //处理人

        public Form1()
        {
            InitializeComponent();
            form1 = this; //静态函数中使用UI控件            
            Control.CheckForIllegalCrossThreadCalls = false; //静态函数中使用UI控件

            var server = WebApp.Start<Startup>(url: "http://localhost:9099/"); // 打开Web服务


            cllist.Add(new cl { way = "人工回复", score = 0.1 });
            cllist.Add(new cl { way = "处理后回复", score = 0.5 });
            cllist.Add(new cl { way = "二次沟通", score = 1 });

            clrenlist.Add(new clren { name = "刘欣", upper_score = 20 });
            clrenlist.Add(new clren { name = "一洋", upper_score = 30 });
            clrenlist.Add(new clren { name = "云川", upper_score = 30 });

            Form1.form1.textBox1.Text = Form1.form1.textBox1.Text + "=======服务webapi地址=============" + "\r\n";
            Form1.form1.textBox1.Text = Form1.form1.textBox1.Text + "http://localhost:9099/api/Query/xxxxxx" + "\r\n\r\n";
        }




        // fa方案工时子表
        public static async Task<string> get_mdy_fa(string xxx)
        {

           
            
          //  faList.Clear();

            var url = "https://innoshare.seres.cn/api/v2/open/worksheet/getFilterRows";
            var objData = new
            {
                appKey = "52c4be3e",
                sign = "MTY4ZmU0MGE3YWQ3NjAzMjVlMGJkMjczNzBNg==",
                worksheetId = "gdtz",
                pageSize = "1000"

            };

            string txt = await url.PostJsonAsync(objData).ReceiveString();   

            var obj = JsonConvert.DeserializeObject<dynamic>(txt); // 从JSON中拉出来动态对象


            /////////处理数据////////////////////////
            gdlist.Clear();
            foreach (var item in obj.data.rows) //每一行数据
            {

                if (item.gdzt == "处理中")  //只处理“处理中”的工单
                {                
                        zgd one = new zgd();
                        one.gongdanhao = item.gongdanhao;
                        one.clfs = item.clfs;   
                
                        var line = JsonConvert.DeserializeObject<dynamic>((string)item.chuliren); //处理人

                        if (line != null)
                        {
                            foreach (var l in line)
                            {
                                zchengyuan tmp = new zchengyuan();
                                tmp.accountId = l.accountId;
                                tmp.fullname = l.fullname;
                                one.chuliren.Add(tmp);
                            }               
                        }
                
                        gdlist.Add(one);
                }
            }





            //把分数匹配上去
            foreach (var item in gdlist)
            {
                item.score = cllist.Where(p => p.way.Equals(item.clfs)).FirstOrDefault().score;
            }


            Form1.form1.textBox1.Text = Form1.form1.textBox1.Text + "=======读取明道云数据=========" + "\r\n";

            foreach (var item in gdlist)
            {
                Form1.form1.textBox1.Text = Form1.form1.textBox1.Text + item.gongdanhao + "," + item.clfs + "," + item.chuliren[0].fullname +"," +item.score + "\r\n";
            }


            Form1.form1.textBox1.Text = Form1.form1.textBox1.Text + "=======计算处理人积分=========" + "\r\n";

            
            
            //按人配匹积分
            foreach (var item in clrenlist)
            {
                item.do_score = gdlist.Where(p => p.chuliren[0].fullname.Equals(item.name)).Select(p => p.score).Sum();

                Form1.form1.textBox1.Text = Form1.form1.textBox1.Text + item.name+ "," + item.do_score + "\r\n";

            }


            Form1.form1.textBox1.Text = Form1.form1.textBox1.Text + "=======输出结果=============" + "\r\n";


            Form1.form1.textBox1.Text = Form1.form1.textBox1.Text + xxx +"," + clrenlist.OrderBy(p => p.do_score).FirstOrDefault().name;


            ////////////////////////////////
            return xxx + "," + clrenlist.OrderBy(p => p.do_score).FirstOrDefault().name;

          
        }




    }


    //===============工时子表========================

    public partial class zgd
    {
        public string gongdanhao { get; set; }  //工单号        
        public string clfs { get; set; }  //处理方式
        public List<zchengyuan> chuliren { get; set; }    //处理人
        public double score { get; set; }    //分数

        public zgd()
        {
            chuliren = new List<zchengyuan>();
        }

    }

    public partial class zchengyuan  //成员 子项
    {
        public string accountId { get; set; }  //id
        public string fullname { get; set; } //fullname
    }

    public  class cl  //处理方式
    {
        public string way { get; set; }  //方式
        public double score { get; set; }    //分数
    }

    public class clren  //处理人
    {
        public string name { get; set; }  //姓名
        public double do_score { get; set; }    //积分
        public double upper_score { get; set; }    //上限
    }


}

        注意最后这个函数返回,需要给IHttpActionResult,明道云接收放只能接收标准的json。用string返回给高级点的系统,它们不能识别文本报文,只能识别很标准的json。

public IHttpActionResult Get(string id)

        // GET api
        public IHttpActionResult Get(string id)
        {      

            Task<string> task = Form1.get_mdy_fa(id);

            var data = new Person { WON = id, NAME = task.Result };

            return Json(data);
        }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘欣的博客

你将成为第一个打赏博主的人!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值