Tag: asp.net web api

如何使用自定义标头将任意JSON数据发送到REST服务器?

TL; DR – 如何使用auth标头将JSON字符串发送到REST主机? 我已经尝试了3种不同的方法,其中一种方法适用于匿名类型。 为什么我不能使用匿名类型? 我需要设置一个名为“Group-Name”的变量,连字符不是有效的C#标识符。 背景 我需要POST JSON但是无法获取正文和内容类型 function#1 – 使用匿名类型 内容类型和数据是正确的,但我不想使用匿名类型。 我想用一个字符串 static void PostData(string restURLBase, string RESTUrl, string AuthToken, string postBody) { HttpClient client = new HttpClient(); client.BaseAddress = new Uri(restURLBase); client.DefaultRequestHeaders.Add(“Auth-Token”, AuthToken); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(“application/json”)); // StringContent content = new StringContent(postBody); var test1 = “data1”; var test2 = “data2”; var test3 […]

ASP.NET Odata Web API的error handling

我很想知道在ODataController中引发exception的最佳实践是什么。 如果在方法中引发exception,则默认情况下将其转换为响应代码500,并且内容包含有关错误的详细信息。 我希望明确响应代码,并在无效密钥的情况下发送400。 例如:如果输入请求具有无效密钥,则希望返回400的HttpResponseCode,并且内容应该具有类似于引发exception的错误详细信息。 非常感谢您的投入

Azure AD API请求401未经授权

我有一个在Azure网站上运行的标准Web API,启用了Azure AD身份validation,当在浏览器中浏览到API时,我可以通过浏览器登录并获得对API的访问权限。 然而,WPF桌面应用程序在提交请求时收到未经授权的响应: var authContext = new AuthenticationContext(authority, new FileCache()); var accessToken = await authContext.AcquireTokenAsync(apiResourceid, clientId, redirectUri, new PlatformParameters(PromptBehavior.Auto)); // accessToken is valid var apiUrl = “https://example.azurewebsites.net/api/list”; var request = new HttpRequestMessage(HttpMethod.Get, apiUrl); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(“Bearer”, accessToken.AccessToken); var response = await httpClient.SendAsync(request); validation成功,我可以在调试时看到用户信息。 我无权访问Azure帐户,但我确信服务AD应用程序已正确配置以允许访问客户端AD应用程序,因为在备用帐户(未正确配置)上进行测试时, AuthenticationContext.AcquireTokenAsync方法失败。 我注意到AuthenticationResult.ExpiresOn总是在过去,但是如果这是未来的日期,则无法扩展它吗? – (时间当然是UTC) 请求: GET https://example.azure websites.net/api/categorisation HTTP/1.1 […]

unit testing自定义Web API AuthorizeAttribute

我正在尝试使用C#中的NUnit进行unit testing,这是一个自定义的授权属性。 特别是在未被授权的情况下已经返回了特定的http状态代码和消息。 我的属性非常简单 – 看起来像这样: public class AuthorizationAttribute : AuthorizeAttribute { public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext) { if (IsAuthorized(actionContext)) return; HandleUnauthorizedRequest(actionContext); } protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext) { actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Forbidden, “You are not authorized to access this resource”); } } 所以为了测试这个(目前在测试领域是新的)我拼凑了下面的代码。 在其中,我附加了一个通用标识与用户名和一些角色数据。 public void Given_UserIsNotInAuthorizedRoles_When_Auhtorizing_ReturnsForbidden() { // Arrange IPrincipal principal = new GenericPrincipal(new […]

将依赖项注入DelegatingHandler

我是dependency injection的新手,但对Ninject和Ninject.Extensions.Logging感到很满意,只要我需要它就可以[Inject]我的ILogger 。 然而,一些DelegatingHandler正在破坏所有的乐趣。 public class HttpsHandler : DelegatingHandler { [Inject] public ILogger Logger { get; set; } protected override Task SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { if (!string.Equals(request.RequestUri.Scheme, “https”, StringComparison.OrdinalIgnoreCase)) { Logger.Info(String.Format(“{0}: is using HTTP”, request.RemoteAddress()); return Task.Factory.StartNew( () => new HttpResponseMessage(HttpStatusCode.BadRequest) { Content = new StringContent(“HTTPS Required”) }); } return base.SendAsync(request, cancellationToken); } […]

如何为某个特定类型而不是全局设置Json.NET ContractSerializer?

我想在我的ASP.NET Web API应用程序中为某些类型设置一个契约序列化程序。 我可以在App_Start / FormatterConfig.cs中全局设置设置,如下所示: public static void RegisterGlobalFormatters(MediaTypeFormatterCollection formatters) { jsonSerializerSettings.ContractResolver = new CriteriaContractResolver(new List(new string[]{“mdData”, “name”, “label”})); … 但是我怎样才能将它应用于一个或多个特定的类类型? 我想这样做的原因是因为我需要能够根据Web服务的配置或参数设置在运行时应该序列化哪些字段,类似于这些示例: 使用JSON.net,在基类上下文中使用时,如何防止派生类的属性序列化? http://json.codeplex.com/discussions/347610

.net WebSocket:CloseOutputAsync vs CloseAsync

我们有一个有效的ASP.NET Web API REST服务,它使用HttpContext.AcceptWebSocketResponse(..)在我们的控制器方法之一上使用WebSockets。 代码看起来像这样的套接字处理程序…… public async Task SocketHandler(AspNetWebSocketContext context) { _webSocket = context.WebSocket; … while(!cts.IsCancellationRequested) { WebSocketReceiveResult result = _webSocket.ReceiveAsync(inputSegment, cts.Token).Result; WebSocketState currentSocketState = _webSocket.State; if (result.MessageType == WebSocketMessageType.Close || currentSocketState == WebSocketState.CloseReceived) { // Should I use .CloseAysnc() or .CloseOutputAsync()? _webSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, “client requested”, cts.Token).Wait(); } if (currentSocketState == WebSocketState.Open) { … } } […]

装饰ASP.NET Web API IHttpController

我正在尝试使用装饰器来包装Web API控制器( IHttpController实现),但是当我这样做时,Web API会抛出exception,因为不知何故它会期待实际的实现。 将装饰器应用于控制器是我成功应用于MVC控制器的一个技巧,我显然希望在Web API中也这样做。 我创建了一个自定义的IHttpControllerActivator ,它允许解析修饰的IHttpController实现。 这是一个剥离的实现: public class CrossCuttingConcernHttpControllerActivator : IHttpControllerActivator { private readonly Container container; public CrossCuttingConcernHttpControllerActivator(Container container) { this.container = container; } public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) { var controller = (IHttpController)this.container.GetInstance(controllerType); // Wrap the instance in one or multiple decorators. Note that in reality, the // […]

Web API OWIN启动exception处理

在我的C#Web API中,我正在尝试添加一个全局exception处理程序。 我一直在使用自定义全局ExceptionFilterAttribute来处理exception并返回一个HttpResponseMessage : public override void OnException(HttpActionExecutedContext context) { … const string message = “An unhandled exception was raised by the Web API.”; var httpResponseMessage = new HttpResponseMessage(HttpStatusCode.InternalServerError) { Content = new StringContent(message), ReasonPhrase = message }; context.Response = httpResponseMessage; } 这适用于处理控制器级别抛出的exception。 但是,在开发期间,由于数据库连接问题,我们从OWIN启动文件中抛出了错误,但是,返回了标准的IISexception,而不是通过全局exception处理程序,并且完整的HTML被返回给我们的API使用者。 我尝试了几种不同的方法来捕获我的OWIN启动中抛出的exception: 自定义ApiControllerActionInvoker : public class CustomActionInvoker : ApiControllerActionInvoker { public override […]

ASP.NET Web Api – 使用Chunked Transfer Encoding时,框架不会将JSON转换为对象

我在Android中有一个http客户端将HTTP PUT请求发送到使用C#和ASP.NET WebApi框架实现的REST api。 只要JSON字段与C#类中的属性匹配,框架就应该能够将JSON神奇地转换(反序列化)到模型类(普通对象)中。 当http请求附带Chunked Transfer Encoding使Content-Length = 0(根据http://en.wikipedia.org/wiki/Chunked_transfer_encoding )并且框架无法映射其中的JSON时,问题就出现了。 Http请求消息,因此参数为null。 看这个简单的例子: [HttpPut] public HttpStatusCode SendData(int id, int count, [FromBody]MyData records, HttpRequestMessage requestMessage) { var content = requestMessage.Content; string jsonContent = content.ReadAsStringAsync().Result; //this gets proper JSON return HttpStatusCode.OK; } 问题是当客户端发送嵌入的http请求时,记录为空。 据我所知,Chunked Transfer编码只是一个传输属性,http客户端或服务器不应该担心应用层(传输层的业务)。 但似乎框架并没有像我想的那样管理它。 我可以从HttpRequestMessage手动检索JSON并将其反序列化为MyData对象,但我无法利用ASP.NET框架的魔力。 而且您知道规则: 您添加的代码越多,您可能会引入的错误就越多 。 有没有办法处理带有JSON的Http Put请求,这些请求来自ASP.NET Web Api 2中的分块传输 ? 编辑 […]