Фильтры не работают должным образом после обновления до последней версии - PullRequest
0 голосов
/ 20 сентября 2018

Я снимаю JSON, выполняя:

    public IResponseFilter GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
    {
        if (request.Url.ToLower().Contains("myurl") )
        {
            return Filters.CreateFilter(request.Identifier.ToString());
        }

        return null;
    }

И для использования фильтра захвата я делаю:

    public void OnResourceLoadComplete(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength)
    {
        if (request.Url.ToLower().Contains("myurl"))
        {
            if (Filters.GetFilter(request.Identifier.ToString()) is JsonFilter filter)
            {
                //Do something and remove filter...
                Filters.DeleteFilter(request.Identifier.ToString());
            }
        }
    }

Моя IResponseFilter реализация:

class Filters
{
    private static ConcurrentDictionary<string, IResponseFilter> dataList = new ConcurrentDictionary<string, IResponseFilter>();

    public static IResponseFilter CreateFilter(string guid)
    {
        var filter = new JsonFilter();
        dataList.TryAdd(guid, filter);

        return filter;
    }

    public static IResponseFilter GetFilter(string guid)
    {
        return dataList[guid];
    }

    public static void DeleteFilter(string guid)
    {
        dataList.TryRemove(guid, out IResponseFilter filter);
    }
}

internal class JsonFilter : IResponseFilter
{
    public List<byte> DataAll = new List<byte>();

    public FilterStatus Filter(Stream dataIn, out long dataInRead, Stream dataOut, out long dataOutWritten)
    {
        try
        {
            if (dataIn == null || dataIn.Length == 0)
            {
                dataInRead = 0;
                dataOutWritten = 0;

                return FilterStatus.Done;
            }

            dataInRead = dataIn.Length;
            dataOutWritten = Math.Min(dataInRead, dataOut.Length);

            dataIn.CopyTo(dataOut);
            dataIn.Seek(0, SeekOrigin.Begin);
            byte[] bs = new byte[dataIn.Length];
            dataIn.Read(bs, 0, bs.Length);
            DataAll.AddRange(bs);

            dataInRead = dataIn.Length;
            dataOutWritten = dataIn.Length;

            return FilterStatus.NeedMoreData;
        }
        catch
        {
            dataInRead = dataIn.Length;
            dataOutWritten = dataIn.Length;

            return FilterStatus.Done;
        }
    }

    public bool InitFilter()
    {
        return true;
    }

    public void Dispose()
    { }
}

Выше работало в старой версии cefSharp.Однако теперь я получаю исключение для GetFilter, поскольку фильтр не найден в словаре.

Что-то изменилось в более новой версии или моя реализация не настолько надежна?

...