示例#1
0
        public void ConvertResponse_Returns_Error_Response_When_Formatter_Write_Throws_Immediately()
        {
            // Arrange
            Mock <JsonMediaTypeFormatter> formatterMock = new Mock <JsonMediaTypeFormatter>()
            {
                CallBase = true
            };

            formatterMock.Setup(m => m.WriteToStreamAsync(It.IsAny <Type>(),
                                                          It.IsAny <object>(),
                                                          It.IsAny <Stream>(),
                                                          It.IsAny <HttpContent>(),
                                                          It.IsAny <TransportContext>())).Throws(new NotSupportedException("Expected error"));

            MemoryStream           memoryStream = new MemoryStream();
            Mock <HttpContextBase> contextMock  = CreateMockHttpContextBaseForResponse(memoryStream);
            HttpResponseBase       responseBase = contextMock.Object.Response;
            HttpRequestMessage     request      = new HttpRequestMessage();

            request.Properties.Add(HttpPropertyKeys.IsLocalKey, new Lazy <bool>(() => true));
            HttpResponseMessage response = new HttpResponseMessage()
            {
                RequestMessage = request
            };

            response.Content = new ObjectContent <string>("hello", formatterMock.Object);

            // Act
            Task task = HttpControllerHandler.ConvertResponse(contextMock.Object, response, request);

            task.Wait();

            // Assert preparation -- deserialize the HttpError response
            HttpError httpError = null;

            memoryStream.Seek(0L, SeekOrigin.Begin);
            using (StreamContent content = new StreamContent(memoryStream))
            {
                content.Headers.ContentType = JsonMediaTypeFormatter.DefaultMediaType;
                httpError = content.ReadAsAsync <HttpError>().Result;
            }

            // Assert
            Assert.Equal <int>((int)HttpStatusCode.InternalServerError, responseBase.StatusCode);
            Assert.True(responseBase.Headers["Content-Type"].StartsWith(JsonMediaTypeFormatter.DefaultMediaType.MediaType));
            Assert.Equal("An error has occurred.", httpError["Message"]);
            Assert.Equal("The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; charset=utf-8'.", httpError["ExceptionMessage"]);
            Assert.Equal(typeof(InvalidOperationException).FullName, httpError["ExceptionType"]);
            Assert.True(httpError.ContainsKey("StackTrace"));

            HttpError innerError = (httpError["InnerException"] as JObject).ToObject <HttpError>();

            Assert.NotNull(innerError);
            Assert.Equal(typeof(NotSupportedException).FullName, innerError["ExceptionType"].ToString());
            Assert.Equal("Expected error", innerError["ExceptionMessage"]);
            Assert.Contains("System.Net.Http.HttpContent.CopyToAsync", innerError["StackTrace"].ToString());
        }
示例#2
0
        private static void Main(string[] args)
        {
            const int TotalRun = 10 * 1000;

            var customerController = new CustomerController();
            var orderController    = new OrderController();
            var customer           = customerController.Get(1);

            var orders = new List <Order>();

            foreach (var orderId in customer.OrderIds)
            {
                orders.Add(orderController.Get(1, orderId));
            }

            var fullCustomer = new FullCustomer(customer)
            {
                Orders = orders
            };

            var s       = JsonConvert.SerializeObject(fullCustomer);
            var bytes   = Encoding.UTF8.GetBytes(s);
            var stream  = new MemoryStream(bytes);
            var content = new StreamContent(stream);

            content.Headers.ContentType = new MediaTypeHeaderValue("application/json");


            var stopwatch = Stopwatch.StartNew();

            for (int i = 1; i < TotalRun + 1; i++)
            {
                var a = content.ReadAsAsync <FullCustomer>().Result;
                if (i % 100 == 0)
                {
                    Console.Write("\r" + i);
                }
            }
            Console.WriteLine();
            Console.WriteLine(stopwatch.Elapsed);

            stopwatch.Restart();
            for (int i = 1; i < TotalRun + 1; i++)
            {
                var sa = content.ReadAsStringAsync().Result;
                var a  = JsonConvert.DeserializeObject <FullCustomer>(sa);
                if (i % 100 == 0)
                {
                    Console.Write("\r" + i);
                }
            }
            Console.WriteLine();
            Console.WriteLine(stopwatch.Elapsed);

            Console.Read();
        }
        private async Task BindFromBody(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken)
        {
            var bodyBinding  = _descriptor.BindWithAttribute(new FromBodyAttribute());
            var memoryStream = new MemoryStream();
            await actionContext.Request.Content.CopyToAsync(memoryStream);

            memoryStream.Position = 0;
            var content = new StreamContent(memoryStream);

            actionContext.Request.Content.Headers.AsEnumerable().ToList().ForEach(x => content.Headers.TryAddWithoutValidation(x.Key, x.Value));
            actionContext.Request.Content = new StreamContent(memoryStream);
            await bodyBinding.ExecuteBindingAsync(metadataProvider, actionContext, cancellationToken);

            var query = GetValue(actionContext) as IClientQuery;

            if (query == null)
            {
                SetValue(actionContext, null);
                return;
            }
            var clientFilterable = query as IClientFilterable;
            var clientSortable   = query as IClientSortable;
            var clientPageable   = query as IClientPageable;

            memoryStream.Position = 0;
            var apiQuery = await content.ReadAsAsync(typeof(ApiQuery), actionContext.ControllerContext.Configuration.Formatters, cancellationToken) as ApiQuery;

            if (apiQuery == null)
            {
                return;
            }
            if (clientFilterable != null && apiQuery.Filter != null && !(apiQuery.Filter is AlwaysTrueFilter))
            {
                clientFilterable.ClientFilter = apiQuery.Filter;
            }
            if (clientSortable != null && apiQuery.Sort != null && !(apiQuery.Sort is RandomSort))
            {
                clientSortable.ClientSort = apiQuery.Sort;
            }
            if (clientPageable != null && (apiQuery.PageSize != null && apiQuery.PageNumber != null))
            {
                clientPageable.ClientPage = new ClientPage
                {
                    PageNumber = apiQuery.PageNumber,
                    PageSize   = apiQuery.PageSize
                };
            }
            SetValue(actionContext, query);
        }