我正在尝试使用ASP.NET Web API为我们的服务设计RESTful Web API.我在弄清楚如何将非CRUD操作路由到正确的控制器操作时遇到了麻烦.让我们假设我的资源是一扇门.我可以用我的门完成所有熟悉的CRUD事情.让我们说我门的模型是:
public class Door
{
public long Id { get; set; }
public string InsideRoomName { get; set; }
public string OutsideRoomName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我可以通过我的web api完成所有标准的CRUD操作:
POST: http://api.contoso.com/v1/doors
GET: http://api.contoso.com/v1/doors
GET: http://api.contoso.com/v1/doors/1234
GET: http://api.contoso.com/v1/doors?InsideRoomName=Cafeteria
PUT: http://api.contoso.com/v1/doors/1234
DELETE: http://api.contoso.com/v1/doors/1234
Run Code Online (Sandbox Code Playgroud)
等等.我遇到麻烦的地方是我需要对我门上的非CRUD动作进行建模.我想针对我的资源建模一个Lock和Unlock动词.阅读ASP.NET文章,指导似乎是在使用自定义操作时切换到RPC样式调用.这给了我一条路:
PUT: http://api.contoso.com/v1/doors/1234/lock
PUT: http://api.contoso.com/v1/doors/1234/unlock
Run Code Online (Sandbox Code Playgroud)
这似乎与REST的精神相冲突,REST旨在指示资源的路径.我想我可以将动词建模为资源:
POST: http://api.contoso.com/v1/doors/1234/lockrequests
POST: http://api.contoso.com/v1/doors/1234/unlockrequests
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我仍然可以使用推荐{controller}/{id}/{action},但似乎我仍然在创建一个混合的RPC/REST API.是否有可能,甚至建议就REST接口而言,将自定义操作放在参数列表中?
PUT: http://api.contoso.com/v1/doors/1234?lock
PUT: http://api.contoso.com/v1/doors/1234?unlock
Run Code Online (Sandbox Code Playgroud)
我可以预见到需要使用查询参数支持此调用,例如:
PUT: http://api.contoso.com/v1/doors?lock&InsideRoomName=Cafeteria
Run Code Online (Sandbox Code Playgroud)
如何创建将此请求映射到我的DoorsController的路由?
public class DoorsController : ApiController
{
public IEnumerable<Doord> Get();
public Door Get(long id); …Run Code Online (Sandbox Code Playgroud) 我的项目包含大量具有属性的类,其后备字段标记为只读,因为它们仅在构造时设置.作为一种风格问题,我喜欢使用自动属性,因为它消除了大量的样板代码,并鼓励使用属性成员而不是支持字段.但是,当使用自动属性时,我失去了我的支持字段的"readonly-ness".我知道当字段以这种方式标记时,编译器/运行时能够利用一些性能增强,所以我希望能够将我的auto-property标记为readonly,如下所示:
[ReadOnly]
public string LastName { get; }
Run Code Online (Sandbox Code Playgroud)
而不是
private readonly string _LastName;
public string LastName
{
get
{
return _LastName;
}
}
Run Code Online (Sandbox Code Playgroud)
有没有一些机制可以做到这一点?如果没有,自定义支持字段的性能增益是否真的值得?
我认为,将该字段公开为公共是另一种选择,以这种方式公开字段似乎是错误的.即
public readonly string LastName;
Run Code Online (Sandbox Code Playgroud) 我正在使用一个协议,在指定日期时间信息时可以选择包括时区偏移.我的代码是用C#编写的,我们使用的是4.0 .NET运行时.我看到有一个格式化选项"zzz"用于在解析和格式化时包含时区信息,但是,似乎冒号(:)是固定的.例如,使用自定义格式字符串(yyyyMMddHHmmsszzz)格式化的Datetime可能显示为:
20100309101530-05:00
我正在使用的协议不包括时区偏移中的冒号.此协议将格式化日期时间,并期望它们格式化为:
20100309101530-0500
在使用包含时区偏移量的自定义格式化程序解析或格式化日期时间时,有没有办法控制冒号的外观?
我正在开发一个系统来支持从各种硬件类型接收状态信息.每个硬件都报告相同的状态信息(纬度,经度),但每种硬件类型都使用唯一的协议来报告此信息.出于这个原因,我有多个服务,每个设备类型一个,监听和解析该设备的协议.我希望每个服务都使用一条公共消息发布状态信息:
public interface IPositionMessage : IMessage
{
string UnitName { get; set; }
double Latitude { get; set; }
double Longitude { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我没有设置我的第一个服务,但现在我正在设置我的第二个服务,我发现我的订阅者无法订阅来自多个发布者的相同消息.
在NServiceBus yahoo组的类似问题中,推荐的解决方案是将公共消息转换为命令并使用Bus.Send而不是Bus.Publish.我觉得在这种情况下没有意义,因为真正发生的事情是一个事件(该单位已经到达一个位置并报告新的位置).如果我要将此转换为命令,我需要提前知道此事件的所有潜在订阅者,我不这样做.另一种可能的解决方案是创建一个聚合/重新发布者,每个服务将Bus.Send,然后该消息将从单个发布者重新发布.这似乎是一个不必要的瓶颈.
是否有任何方法允许订阅者订阅来自多个发布者的相同消息?
我们有一个桌面应用程序,它在后台线程中执行非常严格的计算集.此计算的一部分在我们通过互操作访问的非托管库中执行.我们发现的是,当我们开始计算时,UI线程在计算期间变得没有响应.我们的印象是框架将处理线程切换以允许UI继续响应,但事实并非如此.我们发现可以插入Thread.Sleep(0)或Application.DoEvents()以允许UI响应.这具有减慢计算的副作用.此外,非托管代码执行的部分计算可能需要30秒才能完成,在此期间应用程序始终无响应.整个计算可能需要两到五分钟才能完成.
这导致以下问题:
我被用来支持一些遗留代码,而且我看到一些让我困惑的事情.在代码的某些部分,我看到一个类实例使用CMutex实例来同步方法执行.例如
class CClassA : public CObject
{
public:
void DoSomething();
private:
CMutex m_mutex;
}
void CClassA::DoSomething()
{
m_mutex.Lock();
//...logic...
m_mutex.Unlock();
}
Run Code Online (Sandbox Code Playgroud)
在同一项目的其他地方,我发现代码使用的是CSingleLock
class CClassB : public CObject
{
public:
void DoSomething();
private:
CCriticalSection m_crit;
}
void CClassB::DoSomething()
{
CSingleLock lock(&m_crit);
lock.Lock();
//...logic...
lock.Unlock();
}
Run Code Online (Sandbox Code Playgroud)
在查看MSDN文档以进行同步之后,似乎CClassB正在实施建议的方法,但我不清楚CClassA使用的实现中存在哪些危险.据我所知,这两种方法的唯一区别是CSingleLock具有RAII的优点,因此当执行退出范围时锁会自动释放.这两种实现都有其他好处/缺点吗?
我有一个WCF Web服务定义如下
[OperationContract]
[WebInvoke(
Method = "GET",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare,
UriTemplate = "Assets/{assetId}/Reports/{startDate}/{endDate}")]
JQGridDataStore<Report> GetReportsForAssetFilterByDate(string assetId, string startDate, string endDate);
Run Code Online (Sandbox Code Playgroud)
当我的JQGridDataStore包含数千个Report实例时,我没有遇到任何响应.但是,数据存储超过10,000个报告,我在浏览器中收到以下信息:
错误324(net :: ERR_EMPTY_RESPONSE):未知错误.
我逐步完成了服务的实现,我可以看到它没有任何例外.完全创建JQGridDataStore对象并使用我的10,000 + Report实例进行填充.但是,当我'F10'超过返回时,浏览器显示空响应.这一切都发生在一秒钟之内,所以我认为我没有达到任何类型的超时.
基于此,我认为我遇到了某种类型的缓冲区大小限制.有哪些限制,我将如何调整它们?
我正在使用Visual Studio 6来调试C++应用程序.编译应用程序以支持unicode字符串.CString类型用于操作字符串.当我使用调试器时,监视窗口将显示字符串的第一个字符,但不会显示完整的字符串.我尝试使用XDebug,但此工具无法正确处理unicode字符串.作为一种解决方法,我可以通过索引到CString维护的私有数组来为字符串的每个字符创建一个自定义监视,但这非常繁琐.
如何在VC6调试器中查看CString的完整unicode值?
.net ×3
c# ×3
c++ ×2
rest ×2
cstring ×1
datetime ×1
debugging ×1
json ×1
mfc ×1
nservicebus ×1
timezone ×1
visual-c++ ×1
visual-c++-6 ×1
wcf ×1