天天看点

winform宿主webapi

引用的Dll

winform宿主webapi

添加配置文件packages.config

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.6" targetFramework="net461" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.6" targetFramework="net461" />
  <package id="Microsoft.AspNet.WebApi.SelfHost" version="5.2.6" targetFramework="net461" />
  <package id="Newtonsoft.Json" version="6.0.4" targetFramework="net461" />
</packages>
           

新建Controller文件夹里面的ValuesConntroller.cs类

winform宿主webapi
[RoutePrefix("api/values")]
    public class ValuesController : ApiController
    {
        [HttpGet]
        [Route("st")]
        public string GetServerTim(string id)
        {
            try
            {
                string result = Program.FormCheck.GetJsonById(id);

                return result;
            }
            catch
            {
                return "failed :"+ id;
            }
        }
        protected HttpRequestBase GetRequest()
        {
            HttpContextBase context = (HttpContextBase)Request.Properties["MS_RequestContext"];//获取传统context

            HttpRequestBase request = context.Request;//定义传统request对象

            return request;
        }
        private string GetClientIp(HttpRequestMessage request = null)
        {
            request = request ?? Request;

            if (request.Properties.ContainsKey("MS_HttpContext"))
            {
                return ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress;
            }
            else if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name))
            {
                RemoteEndpointMessageProperty prop = (RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessageProperty.Name];
                return string.Format("Address:{0}, Port: {1}", prop.Address, prop.Port.ToString());
            }
            else if (HttpContext.Current != null)
            {
                return HttpContext.Current.Request.UserHostAddress;
            }
            else
            {
                return null;
            }
        }
    }
           

Program类中这样写

public static class Program
    {
        public static CheckInterface FormCheck = null;
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            FormCheck = new CheckInterface();
            Application.Run(FormCheck);
        }
    }
           

Form中这样写

HttpSelfHostConfiguration config = null;
        HttpSelfHostServer server = null;
      
        public CheckInterface()
        {
            InitializeComponent();
            renderDgv_Interface.AllowUserToAddRows = false;
        }

        private void CheckInterface_Load(object sender, EventArgs e)
        {
            RefreshWebApi();
        }
        private void RefreshWebApi()
        {
            config = new HttpSelfHostConfiguration(Url);// "http://192.168.0.163:8085");
            config.Routes.MapHttpRoute("API Default", "api/{controller}/{id}", new { id = RouteParameter.Optional });
            server = new HttpSelfHostServer(config);
            server.OpenAsync().Wait();
        }
           

启动之后浏览器访问http://192.168.0.163:8085/api/values?id=001即可看到weiapi接口已经成功在Winform上运行。

如果想要访问Webapi执行方法与WinformUI界面交互,用委托另外还要判断几个属性

winform宿主webapi
delegate void DAddRdgvData(List<JsonData> DataSourse);

        private void AddRdgvData(List<JsonData> DataSourse)
        {
            if (renderDgv_Interface.InvokeRequired)
            {
                while (!this.renderDgv_Interface.IsHandleCreated)
                {
                    if (this.renderDgv_Interface.Disposing || this.renderDgv_Interface.IsDisposed)
                        return;
                }
                DAddRdgvData d = new DAddRdgvData(AddRdgvData);
                this.renderDgv_Interface.Invoke(d, new object[] { DataSourse });
            }
            else
            {

                for (int i = 0; i < DataSourse.Count; i++)
                {
                    if (ListId.Contains(DataSourse[i].Id))
                    {
                        for (int j = 0; j < renderDgv_Interface.RowCount; j++)
                        {
                            if (renderDgv_Interface.Rows[j].Cells["rdgv_Interface_id"].Value != null)
                            {

                                if (DataSourse[i].Id.Equals(renderDgv_Interface.Rows[j].Cells["rdgv_Interface_id"].Value.ToString()))
                                {
                                    renderDgv_Interface.Rows[j].Cells["rdgv_Name"].Value = DataSourse[i].Name;
                                    renderDgv_Interface.Rows[j].Cells["rdgv_Time"].Value = DataSourse[i].Time;
                                    renderDgv_Interface.Rows[j].Cells["Rdgv_NumberTimes"].Value = DataSourse[i].Numberoftimes;
                                    renderDgv_Interface.Rows[j].Cells["rdgv_Return"].Value = DataSourse[i].CheckResult;
                                }

                            }
                        }
                    }
                    else
                    {
                       //这里向控件传数据
                    }
                }
            }
        }
           
winform宿主webapi

继续阅读