3
我試圖進入內存託管工作集成測試我們的web api項目,但在使用它時遇到了身份驗證問題。我使用默認的Web Api模板和它創建的值控制器在基本的Web Api項目上重新創建了這個項目。ASP.NET Web API:在集成測試的內存託管中使用驗證
我們使用的是Autofac,所以在測試中也包含了這一點。我們也爲web api使用windows身份驗證,但爲了測試的目的,這並不重要。
問題是測試中的「服務器」始終返回「授權已被拒絕此請求。」
那麼使用內存服務器進行授權的最佳方式是什麼?我已經註釋掉了另一個stackoverflow問題的一些代碼,但是這似乎也沒有工作。
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Web.Http;
using Autofac;
using Autofac.Integration.WebApi;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using WebApiTesting.Controllers;
namespace WebApiTesting.Tests.Controllers
{
[TestClass]
public class ValuesControllerTest
{
private const string URL = "http://test.testing.com/";
private const string Username = "user";
private const string Password = "supersecret";
[TestMethod]
public void InMemoryHosting()
{
var config = new HttpConfiguration();
config.Routes.MapHttpRoute(name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new {id = RouteParameter.Optional});
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
var server = new HttpServer(config);
var builder = new ContainerBuilder();
// Register API controllers using assembly scanning.
builder.RegisterApiControllers(typeof(ValuesController).Assembly);
var container = builder.Build();
server.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
var client = new HttpClient(server);
using (var request = CreateRequest("api/values", "application/json", HttpMethod.Get))
{
//Act
using (HttpResponseMessage response = client.SendAsync(request).Result)
{
// Assert
Assert.IsNotNull(response.Content);
Assert.AreEqual("application/json", response.Content.Headers.ContentType.MediaType);
var content = response.Content.ReadAsStringAsync().Result;
Assert.AreNotEqual("{\"Message\":\"Authorization has been denied for this request.\"}", content);
}
}
}
private HttpRequestMessage CreateRequest(string url, string mthv, HttpMethod method)
{
var request = new HttpRequestMessage { RequestUri = new Uri(URL + url) };
/*byte[] toEncodeAsBytes = Encoding.UTF8.GetBytes(string.Format("{0}:{1}", Username, Password));
request.Headers.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(toEncodeAsBytes));*/
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(mthv));
request.Method = method;
return request;
}
}
}
我不確定這是否是處理它的最佳方式,但它是Microsoft推薦的方式。 – msfanboy 2014-02-02 20:04:57
@msfanboy - 這個微軟建議的鏈接將不勝感激 – 2015-08-20 11:19:10