HttpListener没有收到URI片段

时间:2015-06-23 03:26:53

标签: c#

我正在使用网络API来接收我想在桌面应用程序中处理的OAuth令牌。 Web API将用户重定向到localhost:15779,我可以使用下面的类来监听我的应用程序 这里的问题是所提到的API通过HTTP GET发送令牌但不使用查询参数(?key = value)但是片段参数(#key = value)并且我无法改变该行为,因为它不是我的API。 /> 例如:

http://127.0.0.1:15779/#access_token=b5c283xxxxxxxxe3lili5s003f5fqp&scope=chat_login+user_read

如果您看到下面的代码,您会注意到我将HttpListenerContext.Request.Url.Fragment写入recievedData变量,以便在浏览器中显示它,以用于调试目的地。事情是:它是空的。

有关如何获取令牌的任何想法吗?

class HttpLstn
{
    public String prefixes;
    public static String recievedData = "";

    private static ManualResetEvent _waitHandle = new ManualResetEvent(false);

    public void start(string prefixes)
    {
        this.prefixes = prefixes;
        if (prefixes == null || prefixes.Length == 0)
            throw new ArgumentException("Wrong listener URL");

        using (HttpListener listenOn = new HttpListener())
        {
            if (!listenOn.Prefixes.Contains(this.prefixes))
                listenOn.Prefixes.Add(this.prefixes);

            listenOn.Start();
            Thread.Sleep(100);
            IAsyncResult result = listenOn.BeginGetContext(new AsyncCallback(ListenerCallback), listenOn);
            _waitHandle.WaitOne();

            Thread.Sleep(100);
            listenOn.Close();
        }
    }

    public static void ListenerCallback(IAsyncResult result)
    {
        try
        { 
            HttpListener listenOn = (HttpListener)result.AsyncState;
            HttpListenerContext context = listenOn.EndGetContext(result);
            HttpListenerRequest request = context.Request;

            //DEBUG
            //write URL Fragment to recievedData in order to display it in the browser for testing purposes
            recievedData = context.Request.Url.Fragment;
            //DEBUG

            HttpListenerResponse response = context.Response;
            string responseString = recievedData;
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
            response.ContentLength64 = buffer.Length;
            Stream output = response.OutputStream;
            output.Write(buffer, 0, buffer.Length);
            output.Close();

            _waitHandle.Set();
        }
        catch (HttpListenerException he) { }
        catch (ObjectDisposedException oe) { }
    }
}

1 个答案:

答案 0 :(得分:1)

我也碰到了这个。结果是浏览器不会将片段部分发送到服务器;他们保留它并使用它滚动到返回文档的指定部分。

https://stackoverflow.com/a/14462350/723299