云川给我提了一个需求,要我开发一个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);// 将路由配置附加到 appBuilderappBuilder.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 apipublic string Get(string id){return "hello:" + id;}// POST apipublic string Post([FromBody] string value){return value;}// PUT apipublic void Put(int id, string value){}// DELETE apipublic 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);*/// 将路由配置附加到 appBuilderappBuilder.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 apipublic string Get(string id){ Task<string> task = Form1.get_mdy_fa(id); return task.Result;}/*// POST apipublic string Post([FromBody] string value){return value;}// PUT apipublic void Put(int id, string value){}// DELETE apipublic 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; } //idpublic 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 apipublic IHttpActionResult Get(string id){ Task<string> task = Form1.get_mdy_fa(id);var data = new Person { WON = id, NAME = task.Result };return Json(data);}