为了更好地测试工作Microsoft.Owin.Testing.TestServer,我发现Global.asax没有加载Owin TestServer.
所以,我尝试将我的Global.asax配置移动到Startup.cs,如下所示,
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
// pasted Global.asax things start.
GlobalConfiguration.Configuration.Formatters.Clear();
var jsonSerializerSettings = new JsonSerializerSettings
{
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
};
GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter() { SerializerSettings = jsonSerializerSettings });
GlobalConfiguration.Configuration.Formatters.Add(new FormMultipartEncodedMediaTypeFormatter());
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
// pasted Global.asax things end.
ConfigureAuth(app);
}
}
Run Code Online (Sandbox Code Playgroud)
但TestServer 没到配置的每一点初始化,如AreaRegistration.RegisterAllAreas,FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters),等...
对我来说,最小可行迁移(使用TestServer成功测试)如下所示.
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration(); …Run Code Online (Sandbox Code Playgroud) 我想将JToken内容反序列化为一个对象(User).我怎么能这样做?
这是我的json字符串:
string json = @"[{""UserId"":0,""Username"":""jj.stranger"",""FirstName"":""JJ"",""LastName"":""stranger""}]";
Run Code Online (Sandbox Code Playgroud)
这被发送到api参数as JToken.
用户类:
public class user
{
public int UserId {get; set;}
public string Username {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
Web Api方法:
public IHttpActionResult Post([FromBody]JToken users)
{
UserModel.SaveUser(users);
//...
}
Run Code Online (Sandbox Code Playgroud)
Salesforce中的API调用:
string json = '[{"UserId":0,"Username":"jj.stranger","FirstName":"JJ","LastName":"stranger"}];
HttpRequest req = new HttpRequest();
HttpResponse res = new HttpResponse();
Http http = new Http();
req.setEndpoint('test.com/api/UserManagement');
req.setMethod('POST');
req.setBody(json);
req.setHeader('Content-Type', 'application/json');
try {
res = http.send(req);
} catch(System.CalloutException e) …Run Code Online (Sandbox Code Playgroud) IProductRepositoryProxy ProductDataServiceProviderInstance = new ServiceProductDataProvider();
builder.RegisterInstance(ProductDataServiceProviderInstance).As<IProductRepositoryProxy>();
Run Code Online (Sandbox Code Playgroud)
VS
builder.RegisterType<ServiceProductDataProvider>().As<IProductRepositoryProxy>().InstancePerRequest();
Run Code Online (Sandbox Code Playgroud)
我在这里看到了来自前雇员的代码,并想知道这个人是否想要注册.SingleInstance()行为.
builder.RegisterType<ServiceProductDataProvider>().As<IProductRepositoryProxy>().SingleInstance();
Run Code Online (Sandbox Code Playgroud)
使用RegisterInstance的ServiceProductDataProvider的手动新增与Register .SingleInstance()不同吗?
我有以下控制器:
public class ValuesController : ApiController
{
// POST api/values
public IHttpActionResult Post(string filterName)
{
return new JsonResult<string>(filterName, new JsonSerializerSettings(), Encoding.UTF8, this);
}
}
Run Code Online (Sandbox Code Playgroud)
WebApi配置
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
Run Code Online (Sandbox Code Playgroud)
我使用这个js代码来调用api
$.ajax(
{
url: "/api/values/",
type: "POST",
dataType: 'json',
data: { filterName: "Dirty Deeds" },
success: function (result) {
console.log(result);
},
error: function (xhr, status, p3, p4) {
var err = "Error " + " " + status + " " + p3; …Run Code Online (Sandbox Code Playgroud) 第一次调用我们的API总是非常慢.例如,下面演示了第一次调用完成所需的CPU使用率和时间:

第一次通话最多可能需要30秒,并且几乎可以占用100%的CPU.呼叫2和3需要200ms(他们应该这样做).在回收应用程序池之后,它将在第一次调用时执行相同的操作.
我已经阅读了一些有关IIS"热身"的内容,并完成了以下操作,但没有任何改变:
IIS 8应用程序初始化已安装:

我在IIS中有以下设置:




我实际上是在代码中设置这些RoleEntryPoint.OnStart().
using (var serverManager = new ServerManager())
{
serverManager.ApplicationPoolDefaults.ProcessModel.IdleTimeout = TimeSpan.Zero;
foreach (var application in serverManager.Sites.SelectMany(x => x.Applications))
{
application["preloadEnabled"] = true;
}
foreach (var applicationPool in serverManager.ApplicationPools)
{
applicationPool.AutoStart = true;
applicationPool["startMode"] = "AlwaysRunning";
applicationPool.ProcessModel.IdleTimeout = TimeSpan.Zero;
applicationPool.Recycling.PeriodicRestart.Time = TimeSpan.Zero;
}
serverManager.CommitChanges();
}
Run Code Online (Sandbox Code Playgroud)
我几乎可以肯定实体框架可能是罪魁祸首:
我们在EDMX模型"设计师"中生成大约100个表格的模型.
我们正在生成由EF Power Tools 生成的预编译视图.
运行以下 …
iis entity-framework iis-8 entity-framework-6 asp.net-web-api2
我尝试将Swagger与Microsoft WebAPI 2 一起使用.
目前,我在一个方法中进行了以下调用.
appBuilder
.ConfigureOAuth()
.UseWebApi(configuration)
.UseWelcomePage();
Run Code Online (Sandbox Code Playgroud)
如果我想使用Swagger,我必须使用这个URL" https:// localhost:44300/swagger "哪一个非常好用.
我希望我的主页重定向到我的招摇的网址,也许如下,但这个示例不起作用.
appBuilder
...
.UseWelcomePage("/swagger");
Run Code Online (Sandbox Code Playgroud)
任何的想法 ?
我成功实现了我的自定义OAuthAuthorizationServerProvider.但是当我登录并检索令牌时,我的客户端不知道用户的角色,声明等.
我目前添加了一个webapi控制器来返回委托人的声明列表,但我对此并不满意.
请求令牌时,当前响应如下所示:
{
access_token: "qefelgrebjhzefilrgo4583535",
token_type: "bearer",
expires_in: 59
}
Run Code Online (Sandbox Code Playgroud)
问:如何让它返回类似下面的片段?
{
access_token: "qefelgrebjhzefilrgo4583535",
token_type: "bearer",
expires_in: 59,
user: {
name: 'foo',
role: 'bar'
}
}
Run Code Online (Sandbox Code Playgroud)
我到目前为止的进展:
文件OAuthAuthorizationServerProvider#TokenEndpoint(OAuthTokenEndpointContext)说:
在成功的令牌端点请求的最后阶段调用.应用程序可以实现此调用,以便对用于发出访问或刷新令牌的权利要求进行任何最终修改.也可以使用此调用以向Token端点的json响应主体添加其他响应参数.
我找不到任何如何自定义响应的示例,并且asp-net Identity的源代码尚未发布,所以我很困惑.
我有一个ASP.NET MVC 5 webproject(localhost:81),它使用Knockoutjs从我的WebApi 2项目(localhost:82)调用函数,以便在我启用CORS的两个项目之间进行通信.到目前为止,一切都有效,直到我尝试对WebApi实施OWIN令牌认证.
要在WebApi上使用/ token端点,我还需要在端点上启用CORS,但经过几个小时的尝试和搜索解决方案后,它仍在运行,并且api/token仍然会导致:
XMLHttpRequest cannot load http://localhost:82/token. No 'Access-Control-Allow-Origin' header is present on the requested resource.
public void Configuration(IAppBuilder app)
{
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
TokenConfig.ConfigureOAuth(app);
...
}
Run Code Online (Sandbox Code Playgroud)
TokenConfig
public static void ConfigureOAuth(IAppBuilder app)
{
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<AppUserManager>(AppUserManager.Create);
OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
Provider = new SimpleAuthorizationServerProvider()
};
app.UseOAuthAuthorizationServer(OAuthServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
Run Code Online (Sandbox Code Playgroud)
AuthorizationProvider
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
var appUserManager = context.OwinContext.GetUserManager<AppUserManager>(); …Run Code Online (Sandbox Code Playgroud) 我的应用程序设置为必须使用Web API中的授权属性"授权"除登录之外的所有请求.例如
[Authorize]
[HttpGet, Route("api/account/profile")]
public ApplicationUser Profile()
{
return userModel;
}
Run Code Online (Sandbox Code Playgroud)
并且只有登录需要不授权,因为那里你得到令牌;)
[AllowAnonymous]
[HttpPost, Route("api/account/login")]
public async Task<IHttpActionResult> Login(LoginViewModel model)
{
....
}
Run Code Online (Sandbox Code Playgroud)
而不是必须将[Authorize]属性添加到我的所有路由,有没有办法全局设置它?
asp.net-web-api2 ×10
c# ×5
.net ×1
asp.net ×1
asp.net-core ×1
autofac ×1
cors ×1
iis ×1
iis-8 ×1
javascript ×1
json ×1
json.net ×1
katana ×1
oauth-2.0 ×1
owin ×1
salesforce ×1
swagger ×1
unit-testing ×1