private HttpRequestMessage AspNetRequest(IDictionary <string, string> request)
        {
            var headers       = new Headers.Of(request);
            var aspnetRequest =
                new HttpRequestMessage(
                    methods[new Method.Of(request).AsString()],
                    new Address.Of(request).Value()
                    );

            foreach (var head in headers)
            {
                aspnetRequest.Headers.TryAddWithoutValidation(head.Key(), head.Value());
            }
            var content = Content(request);

            if (!IsEmpty(content))
            {
                aspnetRequest.Content = content;
                foreach (var head in headers)
                {
                    IEnumerable <string> tryValues = new List <string>();
                    if (
                        !aspnetRequest.Content.Headers.TryGetValues(head.Key(), out tryValues) ||
                        !new Contains <string>(tryValues, head.Value()).Value()
                        )
                    {
                        aspnetRequest.Content.Headers.TryAddWithoutValidation(head.Key(), head.Value());
                    }
                }
            }
            return(aspnetRequest);
        }
        /// <summary>
        /// Headers are numbered to allow multiple values for the same key.
        /// Those numbers may differ between template and request,
        /// so headers can not be compared as raw request parts.
        /// </summary>
        private bool HasTemplateHeaders(IDictionary <string, string> request)
        {
            var templateHeaders = new Headers.Of(this.template);
            var requestHeaders  = new Headers.Of(request);
            var applies         = true;

            foreach (var templateHeader in templateHeaders)
            {
                var matches =
                    new Yaapii.Atoms.Enumerable.Filtered <IKvp>(kvp =>
                                                                kvp.Key() == templateHeader.Key() && kvp.Value() == templateHeader.Value(),
                                                                requestHeaders
                                                                );
                if (new Yaapii.Atoms.Enumerable.LengthOf(matches).Value() == 0)
                {
                    applies = false;
                    break;
                }
            }
            return(applies);
        }