云川给我提了一个需求,要我开发一个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);
}
1312

被折叠的 条评论
为什么被折叠?



