我正在编写一个使用ASP.NET Web API代理某些HTTP请求的应用程序,我正在努力识别间歇性错误的来源.这似乎是一种竞争条件......但我并不完全确定.
在我详细介绍之前,这里是应用程序的一般通信流程:
Proxy应用程序使用.NET 4.5在ASP.NET Web API RTM中编写.执行中继的代码如下所示:
//Controller entry point.
public HttpResponseMessage Post()
{
using (var client = new HttpClient())
{
var request = BuildRelayHttpRequest(this.Request);
//HttpCompletionOption.ResponseHeadersRead - so that I can start streaming the response as soon
//As it begins to filter in.
var relayResult = client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).Result;
var returnMessage = BuildResponse(relayResult);
return returnMessage;
}
}
private …Run Code Online (Sandbox Code Playgroud) 我正在编写一个ASP.NET Web API应用程序,它要求我接受文件上载并将该文件转发到另一个HTTP端点.
我担心如果许多用户尝试上传每个100MB的文件(这是一个有效的用例),那么我的应用程序将占用大量内存,并且根据大量请求的数量,这个足迹可能会变大,我的应用程序会龙骨过度死亡.
理想情况下,只要Web服务器开始接收文件以显着减少服务器上的负载,我就会开始将文件流式传输到其他HTTP端点.
我确信这个过程有一个名字,但我不知道 - 这使得搜索相当艰难.
我已经在Web API中使用Response Streaming做了很多工作,但我以前从未考虑过请求流.
我能说得最好我需要弄清楚如何:
任何人都可以给我一些指示吗?
请考虑以下ASP.NET Web API委派处理程序:
public class MyHandler : DelegatingHandler
{
protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
var guid = Guid.NewGuid();
HttpContext.Current.Items["foo"] = guid;
// An Async operation
var result = await base.SendAsync(request, cancellationToken);
//All code from this point is not gauranteed to run on the same thread that started the handler
var restoredGuid = (Guid)HttpContext.Current.Items["foo"];
//Is this gauranteed to be true
var areTheSame = guid == restoredGuid;
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
以上示例位于委托处理程序中,我尝试修复的同一问题适用于控制器,Business Objects等.
我最终试图在每个HTTP请求的各种对象之间提供一些简单的内存中共享状态
据我所知,在异步操作期间,最初运行操作的ASP.NET线程返回到线程池,并且在异步操作完成后可以使用不同的线程来完成请求.
这会影响HttpContext.Current.Items收藏吗? …
我试图解决是否有内置支持绑定复杂类型以形成元素.
使用一个常见的假设情况:我有一个属于类别的Product实体 - 模型看起来像这样:
public class Product
{
public int ID { get; set; }
public string Description { get; set; }
public Category Category { get; set; }
}
public class Category
{
public int ID { get; set; }
public string Title { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
使用ASP.Net MVC框架创建一个表单来水合一个只包含简单值类型的新实体是好的和简单的,例如:
public ActionResult Create(Product product);
Run Code Online (Sandbox Code Playgroud)
但是,您的实体包含其他复杂类型的上述情况又如何呢?是否有内置机制将IEnumerable < T > 绑定到下拉列表,然后在提交表单时自动保护正确的T?
手动完成它将是相当微不足道的 - 我只是试图确定我可以免费开箱即可.
最近在之前的一个项目中,我发现了VB.NET和C#之间的一个特殊区别.
考虑以下C#表达式:
null <= 2
Run Code Online (Sandbox Code Playgroud)
此表达式的计算结果为False,这正是我所期望的.然后是相应的VB.NET表达式:
Nothing <= 2
Run Code Online (Sandbox Code Playgroud)
我很惊讶地发现这个表达式实际上是评估为True
这似乎是两种语言之间相当基本的设计决定,它确实让我感到震惊.
有人能告诉我为什么吗?是null和Nothing是一样的吗?如果是这样,他们为什么表现不同?
我正在研究一个新的ASP.Net项目,我们希望在Windows Azure Web角色中托管它.该项目的技术要求之一是利用ASP.Net Web站点项目模型的完整预编译选项(不可更新,单页组装)- 而不是ASP.Net Web应用程序项目模型.
是否可以在Azure中托管ASP.Net Web站点项目?最好我现在可以告诉Azure的项目模板是ASP.Net Web应用程序.
我正在编写一个使用Microsoft.ServiceBus.dll 1.0.0.0(.NET 3.5版本)的POC应用程序.
我的WCF合同和服务如下所示:
[ServiceContract(Name="MyServiceContract", Namespace = "http://mydomain.com/")]
internal interface IServiceContract
{
[WebInvoke(Method = "POST", UriTemplate = "/DoOperation")]
[OperationContract]
Stream RelayRequest(Stream requestBody);
}
[ServiceBehavior(Name = "Service1", Namespace = "http://mydomain.com/Service1/", InstanceContextMode = InstanceContextMode.Single)]
internal class Service1 : IServiceContract
{
Stream RelayRequest(Stream requestBody)
{
var contents = GetJsonResponse();
var responseStream = new MemoryStream();
var streamWriter = new StreamWriter(responseStream);
streamWriter.AutoFlush = true;
var writer = new JsonTextWriter(streamWriter);
var serializer = new JsonSerializer();
serializer.Serialize(responseStream, contents);
responseStream.Position = 0 // reset the position of the …Run Code Online (Sandbox Code Playgroud) 我们目前正在研究在我们的Web API中使用OData查询语法.我们不打算实现完整的OData实现 - 仅仅利用查询语法.
通常认为将应用程序分成多个层是一种很好的应用程序架构.在现代Web应用程序中,这些层将包括数据层和UI /传输层,它可以在将数据发送给客户时对存储在数据库中的信息进行不同的建模.
例如:您可能有一个如下所示的数据库(实体框架)模型:
public class Employee
{
public Guid Id {get; set;}
public string Name {get; set;}
public int AccessLevel {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
但是您的Web API可能会以不同的有线格式向客户公开这些数据:
public class EmployeeDto
{
public string Name {get; set;}
public string SecurityClearence {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
使用ASP.NET Web API和(可能是??)Microsoft ASP.NET Web API OData库我们如何实现一个场景,我们的客户可以根据DTO格式编写查询,例如:
?$filter=(SecurityClearence eq 'TopSecret')
Run Code Online (Sandbox Code Playgroud)
......然后我们会根据我们的数据格式进行翻译.例如:
?filter=(AccessLevel eq 007)
Run Code Online (Sandbox Code Playgroud)
或其他一些格式,允许我动态查询我的数据库,如表达式.例如:
db.Employees.Where(translatedExpression);
Run Code Online (Sandbox Code Playgroud)
我已经想到了几种手动实现这一目标的方法,但我很想知道其他人如何解决这个问题,因为我觉得到目前为止我的实现是非常粗糙的,不太可能经得起审查.
是否有Web API OData库(以及相关的EDM库)的功能可以为我实现部分或全部功能?
c# expression ado.net-entity-data-model asp.net-web-api asp.net-web-api-odata
我开始在SpecFlow的世界里,我遇到了我的第一个问题.在保持我的代码DRY方面,我想做以下事情:
有两种情况:
Given I am on a product page
And myfield equals todays date
Then...
Given I am on a product page
And myfield equals todays date plus 4 days
Then...
我希望使用以下步骤定义来涵盖我的And子句的两个变体:
[Given(@"myfield equals todays date(?: (plus|minus) (\d+) days)?")]
public void MyfieldEqualsTodaysDate(string direction, int? days)
{
//do stuff
}
但是,当SpecFlow尝试解析int时,我一直得到异常?PARAM.我检查了正则表达式,它肯定按预期解析了场景.我知道我可以像方法重载那样粗糙等等,我只是想知道SpecFlow是否支持默认参数值的想法,或者实际上是另一种方法来实现相同的效果.
非常感谢
标题或多或少都说明了一切.我正在尝试配置JSON MediaTypeFormatter以使每个路由的行为不同.
具体来说,我的WebAPI中有两条路由映射到同一个控制器.每条路线执行相同的操作并返回相同的数据,但出于与现有消费者向后兼容的原因,它们必须略微区别地输出格式.
我可以在Controller中放入一些代码,以确定请求是在传统路由还是新路由中进入,并相应地更改格式化程序.
我还可以使用ActionFilter来更改所需的格式化程序.
然而,我想知道是否有一种方法可以在每个路由级别配置格式化程序,因为这是我的API行为不同的抽象级别.这可以是路径配置点,也可以是代理处理程序.
有什么建议?