Articles of asp.net web api

Url.Link无法在WebAPI中使用

使用下面的unit testing..我试图测试我的webapi。 [Test] public void CheckControllerForCreate() { var config = new HttpConfiguration(); config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; var request = new HttpRequestMessage(HttpMethod.Post, “http://localhost/api/product”); var route = config.Routes.MapHttpRoute(“Foo”, “api/{controller}/{id}”); var routeData = new HttpRouteData(route, new HttpRouteValueDictionary { { “controller”, “products” } }); var controller = new ProductController { ControllerContext = new HttpControllerContext(config, routeData, request), Request = request, Url […]

ConnectionString属性尚未在update-database上初始化

在包管理器控制台中,我在azure上对我的数据库运行命令更新数据库,但是我收到错误,说ConnectionString属性尚未初始化。 我对本地数据库做了同样的事情,一切都很顺利。 在我的web配置中,我已经将连接字符串更改为mach我的azure数据库,这是我的数据库上下文的样子: public class MadLabsDatabaseContext : IdentityDbContext { public MadLabsDatabaseContext() : base(“DefaultConnection”) { Configuration.LazyLoadingEnabled = true; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity() .ToTable(“AspNetUsers”); modelBuilder.Entity() .ToTable(“AspNetUsers”); } } 这是web.config中的连接字符串: 这是我的Package Manager控制台代码: Update-database -ConnectionString “Data Source=tcp:serverName.database.windows.net,1433;Database=madLabs_db;User ID=userName;Password=password;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;MultipleActiveResultSets=True;” -ConnectionProviderName “System.Data.SqlClient” 为什么我收到此错误?

使用API​​Controller补充序列化

我们有多个API控制器接受GET请求,如下所示: //FooController public IHttpActionResult Get([FromUri]Foo f); //BarController public IHttpActionResult Get([FromUri]Bar b); 现在 – 我们希望(或者,被迫) 全局更改GET查询字符串中的DateTime字符串格式 “yyyy-MM-ddTHH:mm:ss” -> “yyyy-MM-ddTHH.mm.ss” 更改后,包含DateTime类型的类的所有[FromUri]序列化都将失败。 有没有办法补充[FromUri]序列化以接受查询字符串中的DateTime格式? 或者我们是否必须为所有API参数构建自定义序列化以支持新的DateTime字符串格式? 编辑 :请求的示例 public class Foo { public DateTime time {get; set;} } //FooController. Let’s say route is api/foo public IHttpActionResult Get([FromUri]Foo f); GET api/foo?time=2017-01-01T12.00.00

‘参数字典包含空条目’错误,Web API

在我的Web API上,我有一个文档控制器,它有两个简单的操作: [AllowAnonymous] public class DocumentController : ApiController { public String Get(int id) { return “test”; } public String Get(string name) { return “test2”; } } 以下URL(执行第一个函数)工作正常: HTTP://本地主机:1895 / API /文档/ 5 但是这个URL(应该执行第二个函数): HTTP://本地主机:1895 / API /文档/测试 引发此错误: {“message”:“请求无效。”,“messageDetail”:“参数字典包含方法’xx.yy.Document Get的非可空类型’System.Int32’的参数’id’的空条目( Int32)’in’API.Controllers.DocumentController’。可选参数必须是引用类型,可以为空的类型,或者声明为可选参数。“ } 这是MapHttpRoute中的MapHttpRoute: config.Routes.MapHttpRoute( name: “DefaultApi”, routeTemplate: “{controller}/{id}”, defaults: new { id = RouteParameter.Optional } […]

使用WebApi和业务层进行Autofac

我是AutoFac的新手,我正在尝试将它用于我的新项目,包括WebApi和Business Layer以及合同及其各自的实现。 我已经编写了webapi的IocConfiguration并从global.asax调用。 但是,对于我的Business Logic,如何使用autofac设置所有合同和实现? 我确实在线阅读了一些教程但是我找不到任何有用的东西,如果有人有一个示例应用程序,链接真的有帮助。 编辑: AutoMapper个人资料。 public class CustomProfile : Profile { protected override void Configure() { CreateMap() .ForMember(d => d.Id, s => s.MapFrom(src => src.Id)); } } 编辑: 经过几个小时的花费,我想出了如何使用AutoFac设置AutoMapper 4.2.1。 显然我在AutoMapper 3.3.0中使用了ConfigurationStore,但是我升级到了4.2.1,配置文件注册发生了一些变化。 以下是对我有用的。 public class AutoMapperModule : Module { protected override void Load(ContainerBuilder builder) { Mapper.Initialize(cfg => { cfg.AddProfile(); cfg.AddProfile(); }); base.Load(builder); […]

JSON.NET反序列化属性名称转换为具有自定义ContractResolver的ExpandoObject

我有这个JSON: {“firstName”: “John”,”lastName”: “Doe”} 这个JSON.NET合同解析器: public class CustomContractResolver : DefaultContractResolver{ protected override string ResolvePropertyName(string propertyName) { return propertyName.Replace(“_”,””); } } 我有这个WebApi Controller方法,使用expando来使用提供的字段部分更新db行: public virtual int Post(int id, JObject content) { var obj = JsonConvert.DeserializeObject(content.ToString(), new JsonSerializerSettings { ContractResolver = new CustomContractResolver() }); db.Update(id, obj) } 我希望反序列化的expando具有属性first_name和last_name以匹配我的模型/ db列名,但是它的属性仍然匹配JSON。 直接反序列化为Person有first_name和last_name有效,正如LB帮助我在下面发现的那样,但是我的db层需要一个Expando来进行部分记录更新,否则它会吹掉没有被json指定的Person任何属性,因此返回null在模型中。 我可以在ContractResolver中做什么来转换Expando的属性?

访问DelegatingHandler中的ApiController类型

我正在使用Asp.Net WebAPI进行项目。 我目前正在进行身份validation和授权。 我有一个messageHandler,它将检查请求的HTTP身份validation标头并构建我的身份和用户配置文件。 但是,我想用操作可能需要的声明来注释我的控制器操作(或仅控制器)(我们有很多用户可以拥有的声明,所以我不想全部加载它们)。 例如: public class MyController : ApiController { [LoadClaims(“SomeClaim”, “SomeOtherClaim”, “etc”)] public string Get() { if (HasClaim(“SomeClaim”)) return “Awesome”; return “Bummer”; } } 在身份validation消息处理程序中,我希望能够查看属性并根据所需内容从数据库中恢复声明。 为此,我需要知道我将根据路线命中的控制器和动作: protected override Task SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { … var routeData = request.GetRouteData(); object controllerName; object actionName; routeData.Values.TryGetValue(“controller”, out controllerName); … 所以我可以做到。 但是现在我需要把它变成一个我可以反思的Type,但我所拥有的只是控制器名称(甚至不是完整的类名或命名空间)。 我怎样才能把它变成我可以反思的东西以获得属性等? 我正在研究DefaultHttpControllerSelector来看看WebAPI堆栈是如何做到的,它似乎使用了HttpControllerTypeCache […]

如何从Catch块返回错误消息。 现在回来是空的

我的ApiKeyvalidation示例代码如下(我使用的是MVC4 web api RC): public class ApiKeyFilter : ActionFilterAttribute { public override void OnActionExecuting(HttpActionContext context) { //read api key from query string string querystring = context.Request.RequestUri.Query; string apikey = HttpUtility.ParseQueryString(querystring).Get(“apikey”); //if no api key supplied, send out validation message if (string.IsNullOrWhiteSpace(apikey)) { var response = context.Request.CreateResponse(HttpStatusCode.Unauthorized, new Error { Message = “You can’t use the […]

在asp.net Web api和angular js中使用的身份validation方法

我正在使用Web api和angular js创建一个网站,我对在我的网站上使用的身份validation感到非常困惑。 我创建了一个login.js ,其中有我的Login方法,它将我的用户名/ Emailid和密码发布到我的Web Api,web api中的方法将validation该用户。 码: $scope.Login() { $.post(“api/Authentication/Login”,Username,Password) { } } Web api代码: [Route] Public Task Login([FromBody] username,password) { //method to authenticate user from database. //Now the tricky parts comes like after authenticating user should i //just store the user id in my session like this Session[“userid]=id or //Should i go […]

使用angular post将两个参数传递给WEB API调用

我的WEB API控制器中有以下post方法: public async Task SendPost(Application application) 我使用angular.js $http.post通过javascript调用它,并将应用程序参数作为JSON传递: $http.post(“/api/AController/SendPost”, JSON.stringify(application)). success(function (data, status, headers, config) { } 这很有效。 现在我想将第二个参数作为一个简单的字符串传递(我无法修改现有的应用程序JSON对象)。我尝试了几种不同的方式在网上建议,但它们似乎都没有工作。 我需要能够像这样做: 控制器: public async Task SendPost(RentalApplication application,string test) 使用Javascript: $http.post(“/api/TessIntegration/SendPost”, {application:JSON.stringify(application),test:”Some value”}). success(function (data, status, headers, config) { }