以编程方式触发listener.GetContext()

时间:2017-08-30 11:11:27

标签: c# httplistener

是否可以使用触发器URL触发以下代码? 而不是通过访问浏览器中的URL来触发。

var context = listener.GetContext();

这样的东西?

var triggerURL = "http://www.google.ie/";
var request = (HttpWebRequest)WebRequest.Create(triggerURL);

或者是否可以使用do while循环? I.E在获取上下文时创建触发器

1 个答案:

答案 0 :(得分:0)

我没有使用listener.GetContext(),而是使用listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener)listener.EndGetContext(result),使用异步调用GetAsync来满足我的要求。

    public static string RunServerAsync(Action<string> triggerPost)
    {
        var triggerURL = "";
        CommonCode(ref triggerURL);

        if (listener.IsListening)
        {
            triggerPost(triggerURL);
        }

        while (listener.IsListening)
        {
            var context = listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);
            context.AsyncWaitHandle.WaitOne(20000, true); //Stop listening after 20 seconds (20 * 1000).
            listener.Close();
        }

        return plateString;
    }

    private static async void TriggerURL(string url)
    {
        var r = await DownloadPage(url);
    }

    static async Task<string> DownloadPage(string url)
    {
        using (var client = new HttpClient())
        {
            using (var r = await client.GetAsync(new Uri(url)))
            {
                if (r.IsSuccessStatusCode)
                {
                    string result = await r.Content.ReadAsStringAsync();
                    return result;
                }
                else
                {
                    return r.StatusCode.ToString();
                }
            }
        }
    }

    private static void ListenerCallback(IAsyncResult result)
    {
        try
        {
            HttpListener listener = (HttpListener)result.AsyncState;
            // Use EndGetContext to complete the asynchronous operation.
            HttpListenerContext context = listener.EndGetContext(result);

            if (context != null)
            { 
                plateString = ProcessRequest(context);
            }
            else
            {
                plateString = "No response received!";
            }
        }
        catch (Exception ex)
        {
            NLogManager.LogException(ex);
        }
    }