使用Web API在网站和本地控制台应用程序之间进行通信

时间:2016-12-20 11:26:02

标签: c# asp.net asp.net-web-api asp.net-web-api2

我必须在本地计算机上开发类似ASP.NET C#控制台应用程序或Web服务的东西,它能够从网站获取数据并发送回来。 我的网站在远离我的服务器上。我还有一台连接到打印机的本地机器。 任务如下:有人在文本框中将一些数据放在网站上,选择正确的打印机并按下打印(因此网站需要连接到本地计算机的可用打印机的当前列表)。本地机器获取并打印出数据,然后发回一些确认信息。

我正在使用Web Api在网站和控制台应用程序之间进行通信。

这就是Web API现在的样子:

public class LabelController : UmbracoApiController
{
    Label[] labels = new Label[]
    {
        new Label { Product="Black Top", Location="T1", VariantSKU="1111" }           
    };

    [HttpGet]
    [ActionName("SendLabel")]
    public Label SendLabel(Label currentLabel)
    {            
        Label lbl = currentLabel;
        return lbl;           
    }

    [HttpGet]
    [ActionName("SendAllLabels")]
    public IEnumerable<Label> SendAllLabels()
    {
        return labels;
    }               

    [HttpPost]
    [ActionName("GetPrinters")]
    public void GetPrinters([FromBody]string value)
    {
        //Here I should get the list of printers from the local machine
    }

}

这是我尝试从网站调用以将标签发送到本地计算机的方式:

Label printlabel = new Label { Product = "Awesome T-Shirt", Location = "T1", VariantSKU = "0000000" };

        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://localhost:49423/");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            var webapi = new LabelController();
            webapi.SendLabel(printlabel);

        }

这就是我在控制台应用程序中使用Web API的方式:

public class Label
{
    public string Product { get; set; }
    public string Location { get; set; }
    public string VariantSKU { get; set; }
}

class Program
{
    static HttpClient client = new HttpClient();

    static void Main(string[] args)
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://localhost:49423/");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));            

            PrintData();
            PrinterList();
        }
    }        

    static void PrintData()
    {
        try
        {
            HttpResponseMessage resp = client.GetAsync("umbraco/api/Label/SendLabel").Result;
            resp.EnsureSuccessStatusCode();
            var label = resp.Content.ReadAsAsync<Label>().Result;         
            Console.WriteLine(label.Product);

        }

        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }

    private static async void PrinterList()
    {           
        var printerQuery = new ManagementObjectSearcher("SELECT * from Win32_Printer");
        foreach (var printer in printerQuery.Get())
        {
            var name = printer.GetPropertyValue("Name");
            var status = printer.GetPropertyValue("Status");
            var isDefault = printer.GetPropertyValue("Default");
            var isNetworkPrinter = printer.GetPropertyValue("Network");

            // Here I should send the parameters back to the website
        }
    }

}

我的问题是我无法将标签放到SendLabel操作中,而且我不知道如何将数据从控制台应用程序发送到网站。

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以在控制台应用程序中托管WCF服务。此服务将返回打印机列表。您的web api可以使用此WCF服务来获取打印机。 WCF服务可以有方法:

  • GetPrinters
  • 打印

成功打印后,您的控制台应用程序可以调用Web API进行确认。

答案 1 :(得分:0)

在这里您需要后台流程,后台流程会在每一秒后检查您的数据库,当后台流程在您的表格中找到任何新数据时,您可以将您的消息发送给您的用户。但问题是如何可能的? 首先使用visual studio创建窗口服务

  1. 在您的窗口服务中创建一个主题
  2. 在onStartMethod()中与您的数据库建立连接。通过您的网站设置一个标志(用于识别输入的新记录)。
  3. 如果您使用webapi向用户发送值发送消息,请检查窗口服务的onstartMethod()上的标记值