当我向它发出请求时,此代码挂起(不返回响应):
public class MyController : ApiController
{
public async Task<IQueryable<int>> Get()
{
return await new Task<IQueryable<int>>(() => new List<int>().AsQueryable());
}
}
Run Code Online (Sandbox Code Playgroud)
但这种方法很好:
public IQueryable<int> Get()
{
return new List<int>().AsQueryable();
}
Run Code Online (Sandbox Code Playgroud)
我缺少什么基础知识??!
我有一个Web API控制器.它调用一个返回IAsyncResult的方法.当我调用控制器时,我收到错误
在异步操作仍处于挂起状态时完成异步模块或处理程序.
如何让控制器等待asyncresult?
我打算使用await,但我可能还没有弄清楚这个用例的语法.
我还没有找到关于SO的现有答案.
我正在使用c#4.5
[HttpGet]
[Route("GetGridDataAsync")]
public string GetGridDataAsync()
{
var proxy = new Proxy();
return proxy.BeginGetDataAsync("test", ar => proxy.EndGetDataAsync(ar));
}
public IAsyncResult BeginGetDataAsync(string r, AsyncCallback callback){}
public DataResponse[] EndGetDataAsync(IAsyncResult asyncResult){}
Run Code Online (Sandbox Code Playgroud) 我们正在从MVC站点使用WebAPI.我们从这样的控制台应用程序中做了一个概念验证,使用了AddUser Method,它在我们的数据库中调节了一个新用户.
static void Main()
{
M_Users user = new M_Users();
var newUser = new M_Users()
{
Password = "123",
FirstName = "Andrew",
Email = "someAndrew@someplace.com",
AdminCode = 1,
IsDisabled = false,
CountryId = 48,
CityId = 149,
DepartmentId = 3,
CreationDate = DateTime.Now,
CreatorUserId = 1
};
var star = RunAsync(newUser);
star.Wait();
//THIS LINE IS REACHED ALWAYS
Console.WriteLine(star.Result.UserID);
Console.ReadLine();
}
static async Task<M_Users> AddUserAsync(M_Users newUser)
{
M_Users user = new M_Users();
string requestUri = "api/User/AddUser";
using (var client = …Run Code Online (Sandbox Code Playgroud) 我目前正在使用ASP.NET MVC和单个Controller来获得各种"API".我正在使用从每个操作方法调用的服务/存储库模式.
类似如下:
库:
public IQueryable<Order> GetOrders()
{
return from sqlOrder in DB.Orders
select new Order
{
Id = sqlOrder.Id,
Name = sqlOrder.Name,
Price = sqlOrder.Price
};
}
Run Code Online (Sandbox Code Playgroud)
服务:
public List<Order> GetOrders()
{
return Repo.GetOrders().ToList();
}
Run Code Online (Sandbox Code Playgroud)
控制器/行动:
public JsonResult GetOrders()
{
var orders = Service.GetOrders();
return Json(orders, JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)
一切都很好,但我正在考虑转移到WEB API和Async/Await
类似如下:
存储库:(无变化)
public IQueryable<Order> GetOrders()
{
return from sqlOrder in DB.Orders
select new Venue
{
Id = sqlOrder.Id,
Name = sqlOrder.Name,
Price = sqlOrder.Price
};
}
Run Code Online (Sandbox Code Playgroud)
服务:
public …Run Code Online (Sandbox Code Playgroud) 我有AngularJs前端Web应用程序,它与NancyFx编写的后端Web API进行通信.我和Nancy有性能问题,每当我调用我的API服务时,Nancy首先扫描我模块中的每个方法,然后输入正确的方法.
例如:
在我的Nancy模块中,我有Get,Post,Put和Delete.当我在API上调用get方法时,Nancy会扫描Get,Post,Put,Delete,然后输入Get方法.所以每当我打电话给服务时,至少需要2秒才能输入正确的方法.
据我所知,南希默认扫描模块识别正确的路线,但在我的情况下这需要太长时间.我的模块类不是很大我在模块中有大约150行代码.
这是默认的Nancy行为,是否可以在Boostrap中重写,或者如何提高性能?
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
public HttpResponseMessage Get( string where_name,
IndexFieldsModel index_fields = null )
public class IndexFieldsModel
{
public List<IndexFieldModel> Fields { get; set; }
}
public class IndexFieldModel
{
public string Name { get; set; }
public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是我的API.我的问题是index_fields是名称值对的集合,它是可选的和可变长度.问题是我不知道将提前传递给我的GET方法的名称.一个示例电话是:
/api/workitems?where_name=workitem&foo=baz&bar=yo
IModelBinder是走这里的方式,还是有更简单的方法?如果是IModelBinder我如何遍历名称?我去这里看一个IModelBinder的例子:http: //www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api 但是我没有看到一种迭代名称的方法,并选择"foo"和"bar".
我尝试将index_fields更改为Dictionary<string, string>没有IModelBinding,但没有做任何事情:index_fields为null.当我在做IModelBinder并调试我的IModelBinder.BindModel例程时,如果我深入查看ModelBindingContext对象,我可以在其中看到"foo"和"bar"值System.Web.Http.ValueProviders.Providers.QueryStringValueProvider,但我不知道如何使用它.我尝试从头创建一个QueryStringValueProvider但它需要一个HttpActionContext.再一次,我没有看到迭代通过键获得"foo"和"bar"的方法.
顺便说一句:我正在使用VS2012
我正在开发mvc4中的webapi.我想创建一个包含自定义一个类HttpStatusCode,其inherits HttpStatusCode类.假设我有一个signupapi需要用户详细信息,如姓名,姓氏,电子邮件,密码等.假设用户输入电子邮件abc@abc.com,我检查用户是否已经存在.如果此电子邮件已存在,我想返回Custom HttpStatusCode.假设我已经创建了1001 HttpStatusCode用于电子邮件.
我试过这样的事情
return new System.Web.Http.Results.ResponseMessageResult(
Request.CreateErrorResponse(
(HttpStatusCode)1001,
new HttpError("Email is already exists.")
)
);
Run Code Online (Sandbox Code Playgroud)
但我不知道这是不是正确的方法.当我们使用return Unauthorized();它意味着它是一个未经授权的访问,返回401错误代码.同样,我想创建一个自定义响应和状态代码.在我的情况下,假设电子邮件ID已经存在,那么我应该返回这样的
return AlreadyExists()返回1001状态代码的东西.我可以实现这样的方式吗?如果是的话,我该如何实现呢?有人可以帮帮我吗?
为了在Visual Studio 2013中调试Web API项目,我必须将Debug配置的输出路径设置为(意味着文件最终相对于解决方案根文件夹),这可以从这里的一些答案中看出.bin\{ProjectName}\bin
但是现在我面临的问题是我们bin\{ConfigurationName}在构建服务器设置中的几个地方使用了路径.我非常想统一Debug的设置和其他Visual Studio配置.
因此我的问题是:您是否知道统一所有配置的输出文件夹会产生任何问题bin\,导致文件夹结构{ProjectName}\bin?
如果这样做,有没有办法在不更改输出文件夹的情况下调试Web API项目bin\Debug\?
我有一个api调用,作为另一个api调用的简单passthrough(出于安全目的).我只是想返回json响应,所以我不必复制一个对象或为一个调用创建一个完整的ws客户端这可能吗?这是我得到的:
[Route("PreUpload")]
[HttpPost]
[Authorize]
public async Task<IHttpActionResult> PreUpload(PreUploadInfoModel model)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(ConfigurationManager.AppSettings["FileServerURI"].ToString());
model.UserId = CurrentUserID;
var response = await client.PostAsJsonAsync("api/files/PreUpload", model);
if (response.IsSuccessStatusCode)
{
// response.Content.ReadAsStringAsync().Result = "{\"UploadId\":\"blah\",\"NextChunk\":0,\"ChunkSize\":123,\"Key\":\"someKey\",\"Token\":\"myToken\"}"
return Json(response.Content.ReadAsStringAsync().Result);
}
return BadRequest(response.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
应该简单吧?但这会将此返回给浏览器:
undefined:2.1241246524224146e+43
我对单元测试很陌生,我很挣扎.我想在ASP.NET MVC中创建WebAPI,测试项目包含控制器的测试方法.我已经阅读了很多关于IoC/DI的内容,我已经在其他项目中使用过它,但没有使用单元测试.作为IoC/DI的许多优点之一,经常会提到测试方法的模拟类注入,但我从来没有找到使用单独项目的方法.
那么我如何设置IoC/DI容器,使其包含生产类和模拟类,但当然模拟类不是与生产代码相互作用,而是单独定位并且只在测试项目中可见?
asp.net-web-api ×10
c# ×9
async-await ×4
asp.net ×3
asp.net-mvc ×3
.net ×1
angularjs ×1
asynchronous ×1
c#-5.0 ×1
json ×1
mocking ×1
nancy ×1
rest ×1
unit-testing ×1