我希望在使用ASP.NET Web API时从客户端应用程序验证用户身份.我观看了网站上的所有视频,并阅读了此论坛帖子.
[Authorize]正确放置属性会返回401 Unauthorized状态.但是,我需要知道如何允许用户登录API.
我想从Android应用程序向API提供用户凭据,让用户登录,然后对所有后续API调用进行预先验证.
我需要从ASP.NET Web API控制器以纯文本形式获得响应.
我试过做一个请求,Accept: text/plain但它似乎没有做的伎俩.此外,请求是外部的,不受我的控制.我要做的是模仿旧的ASP.NET方式:
context.Response.ContentType = "text/plain";
context.Response.Write("some text);
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
编辑,解决方案:根据Aliostad的回答,我添加了WebAPIContrib文本格式化程序,在Application_Start中初始化它:
config.Formatters.Add(new PlainTextFormatter());
Run Code Online (Sandbox Code Playgroud)
我的控制器最终结果如下:
[HttpGet, HttpPost]
public HttpResponseMessage GetPlainText()
{
return ControllerContext.Request.CreateResponse(HttpStatusCode.OK, "Test data", "text/plain");
}
Run Code Online (Sandbox Code Playgroud) 从Web API 2的模板,post方法总是这样:
[ResponseType(typeof(MyDTO))]
public IHttpActionResult PostmyObject(MyDTO myObject)
{
...
return CreatedAtRoute("DefaultApi", new { id = myObject.Id }, myObject);
}
Run Code Online (Sandbox Code Playgroud)
我不明白这种CreatedAtRoute()方法.任何人都可以CreatedAtRoute()向我解释这个方法吗?
我有一个提供XML/JSON的ApiController,但我希望我的一个动作可以返回纯HTML.我尝试了下面但它仍然返回XML/JSON.
public string Get()
{
return "<strong>test</strong>";
}
Run Code Online (Sandbox Code Playgroud)
这就是上面的回报:
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/"><strong>test</strong></string>
Run Code Online (Sandbox Code Playgroud)
有没有办法只返回纯粹的,未转义的文本,甚至没有周围的XML标签(可能是一个不同的返回类型的动作属性)?
在ASP.NET MVC中,我们有@Url.Action行动.有类似的东西@Url.Api会路由到/ api/controller吗?
我正在学习Web API堆栈,我正在尝试使用Success和ErrorCodes等参数以"Result"对象的形式封装所有数据.
然而,不同的方法会产生不同的结果和错误代码,但结果对象通常会以相同的方式实例化.
为了节省一些时间并且还要了解有关C#中的异步/等待功能的更多信息,我试图将我的web api操作的所有方法体包装在一个异步操作委托中,但是陷入了一些障碍......
public class Result
{
public bool Success { get; set; }
public List<int> ErrorCodes{ get; set; }
}
public async Task<Result> GetResultAsync()
{
return await DoSomethingAsync<Result>(result =>
{
// Do something here
result.Success = true;
if (SomethingIsTrue)
{
result.ErrorCodes.Add(404);
result.Success = false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想编写一个方法,对Result对象执行操作并返回它.通常通过同步方法
public T DoSomethingAsync<T>(Action<T> resultBody) where T : Result, new()
{
T result = new T();
resultBody(result);
return result;
}
Run Code Online (Sandbox Code Playgroud)
但是如何使用async/await将此方法转换为异步方法?
这是我尝试过的:
public async Task<T> DoSomethingAsync<T>(Action<T, Task> resultBody) …Run Code Online (Sandbox Code Playgroud) 我正在开发一个API来使用ASP.NET Web API公开一些数据.
在其中一个API中,客户希望我们以yyyy-MM-dd格式显示日期.我不想更改全局设置(例如GlobalConfiguration.Configuration.Formatters.JsonFormatter),因为它非常特定于此客户端.我在多个客户的解决方案中进行开发.
我能想到的解决方案之一是创建一个自定义JsonConverter,然后将其放入我需要进行自定义格式化的属性
例如
class ReturnObjectA
{
[JsonConverter(typeof(CustomDateTimeConverter))]
public DateTime ReturnDate { get;set;}
}
Run Code Online (Sandbox Code Playgroud)
只是想知道是否还有其他一些简单的方法.
当用户加载页面时,它会发出一个或多个ajax请求,这些请求会命中ASP.NET Web API 2控制器.如果用户导航到另一个页面,则在这些ajax请求完成之前,浏览器会取消这些请求.然后,我们的ELMAH HttpModule为每个取消的请求记录两个错误:
错误1:
System.Threading.Tasks.TaskCanceledException: A task was canceled.
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Filters.AuthorizationFilterAttribute.<ExecuteAuthorizationFilterAsyncCore>d__2.MoveNext()
--- End of stack trace from previous location where exception was …Run Code Online (Sandbox Code Playgroud) asp.net iis task-parallel-library async-await asp.net-web-api
我尝试了本文中所写的所有内容:http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api,但没有任何作用.我正在尝试从webAPI2(MVC5)获取数据以使用angularJS在另一个域中使用.
我的控制器看起来像这样:
namespace tapuzWebAPI.Controllers
{
[EnableCors(origins: "http://local.tapuz.co.il", headers: "*", methods: "*", SupportsCredentials = true)]
[RoutePrefix("api/homepage")]
public class HomePageController : ApiController
{
[HttpGet]
[Route("GetMainItems")]
//[ResponseType(typeof(Product))]
public List<usp_MobileSelectTopSecondaryItemsByCategoryResult> GetMainItems()
{
HomePageDALcs dal = new HomePageDALcs();
//Three product added to display the data
//HomePagePromotedItems.Value.Add(new HomePagePromotedItem.Value.FirstOrDefault((p) => p.ID == id));
List<usp_MobileSelectTopSecondaryItemsByCategoryResult> items = dal.MobileSelectTopSecondaryItemsByCategory(3, 5);
return items;
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个使用ASP.NET开发的单页Web应用程序.我最近使用SignalR库将许多Web方法转换为基于推送的方法.这真的大大增加了页面,减少了页面上的大量服务器调用.
与此同时,我也一直在寻找RESTful ASP.NET WebAPI的一些服务器端方法,真正的美妙之处在于它允许在我开发的同时为外部应用程序创建API.核心应用程序(这对我正在做的事情很重要).
然而,在看了几篇文章和这 两个问题后,似乎推送和WebAPI方法似乎是两种完全不同的客户端 - 服务器通信范例.我敢肯定我可以创建各种方法,可以通过任何协议访问,但我不确定是否有这个陷阱或如果这被认为是草率 - 也许有一个更优雅的方式来实现我的目标对于.
在某种情况下,我希望RESTful WebAPI通过SignalR集线器广播事件......相反(SignalR需要访问WebAPI)似乎不太可能,但我认为仍然可能.
有没有人这样做过?有没有人对如何进行有任何建议或提示?这里最优雅的方式是什么?
asp.net-web-api ×10
asp.net ×5
c# ×4
asp.net-mvc ×2
async-await ×2
.net ×1
android ×1
angularjs ×1
asynchronous ×1
c#-5.0 ×1
cors ×1
datetime ×1
iis ×1
json.net ×1
rest ×1
signalr ×1