将非CRUD操作添加到RESTful服务的"RESTful"方式是什么?假设我有一个允许CRUD访问这样的记录的服务:
GET /api/car/123 <- Returns information for the Car object with ID 123
POST /api/car <- Creates a new car (with properties in the request)
PUT /api/car/123 <- Updates car 123 (with properties in the request)
DELETE /api/car/123 <- Deletes car 123
POST /api/car/123/wheel/ <- Creates a wheel and associates it to car 123
Run Code Online (Sandbox Code Playgroud)
如果我想改变汽车的颜色,我会简单地POST /api/car/123为新颜色添加一个POST变量.
但是,假设我想购买一辆汽车,而且这种操作比简单地更新"用户"记录的"拥有汽车"属性更复杂.简单地做一些类似于POST /api/car/123/purchase"购买"本质上是方法名称的东西是RESTful 吗?或者我应该使用自定义HTTP动词,PURCHASE而不是POST?
或者非CRUD操作是否完全超出REST的范围?
背景
我有一个Windows服务,它使用各种第三方DLL来执行PDF文件的工作.这些操作可能会占用相当多的系统资源,并且在发生错误时偶尔会出现内存泄漏.DLL是围绕其他非托管DLL的托管包装器.
现行解决方案
我已经在一个案例中通过在专用控制台应用程序中包含对其中一个DLL的调用并通过Process.Start()调用该应用程序来缓解此问题.如果操作失败并且存在内存泄漏或未释放的文件句柄,则无关紧要.该过程将结束,操作系统将恢复句柄.
我想将这个相同的逻辑应用到我的应用程序中使用这些DLL的其他地方.但是,我对于在我的解决方案中添加更多控制台项目并编写更多可以调用Process.Start()并解析控制台应用程序输出的样板代码感到非常兴奋.
新解决方案
专用控制台应用程序和Process.Start()的优雅替代方案似乎是使用AppDomains,如下所示:http: //blogs.geekdojo.net/richard/archive/2003/12/10/428.aspx.
我在我的应用程序中实现了类似的代码,但单元测试并不乐观.我在一个单独的AppDomain中创建一个测试文件的FileStream,但不要处理它.然后我尝试在主域中创建另一个FileStream,并且由于未释放的文件锁而失败.
有趣的是,将空DomainUnload事件添加到工作程序域会使单元测试通过.无论如何,我担心可能创建"工人"AppDomains无法解决我的问题.
思考?
代码
/// <summary>
/// Executes a method in a separate AppDomain. This should serve as a simple replacement
/// of running code in a separate process via a console app.
/// </summary>
public T RunInAppDomain<T>( Func<T> func )
{
AppDomain domain = AppDomain.CreateDomain ( "Delegate Executor " + func.GetHashCode (), null,
new AppDomainSetup { ApplicationBase = Environment.CurrentDirectory } );
domain.DomainUnload += ( sender, e ) => …Run Code Online (Sandbox Code Playgroud) 编写几乎所有对象属性的__getstate__方法的最佳方法是什么,但不包括几个?
我有一个具有许多属性的对象,包括一个引用instancemethod的属性.instancemethod不是pickleable,所以当我尝试pickle这个对象时我收到一个错误:
class Foo(object):
def __init__(self):
self.a = 'spam'
self.b = 'eggs'
self.c = 42
self.fn = self.my_func
def my_func(self):
print 'My hovercraft is full of eels'
import pickle
pickle.dumps(Foo()) # throws a "can't pickle instancemethod objects" TypeError
Run Code Online (Sandbox Code Playgroud)
这个__getstate__方法解决了这个问题,但是我必须手动包含我要序列化的所有属性:
def __getstate__(self):
return { 'a': self.a, 'b': self.b, 'c': self.c }
Run Code Online (Sandbox Code Playgroud)
如果我有一个具有许多属性或频繁更改的对象,那么这不是很可扩展或可维护的.
我能想到的唯一选择是某种辅助函数,它迭代对象的属性,并根据类型将它们(或不是)添加到字典中.
ASP.NET MVC对基于角色的安全性有很好的支持,但是将字符串用作角色名称是令人抓狂的,因为它们不能作为枚举强类型化.
例如,我的应用中有"管理员"角色."Admin"字符串现在将存在于我的操作的Authorize属性中,我的母版页(用于隐藏选项卡),我的数据库中(用于定义每个用户可用的角色)以及我的代码或视图中的任何其他位置我需要为管理员或非管理员用户执行特殊逻辑的文件.
是否有更好的解决方案,缺少编写我自己的授权属性和过滤器,这可能会处理枚举值的集合?
在项目中升级NHibernate和FluentNHibernate DLL后,我现在在初始化SessionFactory时遇到"无法确定:MyApp.Domain.Entities.AppCategory的类型"异常.我的代码中唯一的变化是调整ForeignKeyConvention的实现来覆盖GetKeyName ( Member member, Type type )抽象方法,而不是GetKeyName ( PropertyInfo property, Type type ).
对于FluentNHibernate,升级的DLL从1.0.0.593到1.1.0.685,对于NHibernate,升级的DLL从2.1.0.4000到2.1.2.4000.寻找解决方案的部分困难是我们正在使用的NHibernate版本的旧时代,但至少目前还无法改变.
我在下面发布了完整的例外和所有相关的代码和配置.我为这个长度道歉,但我不知道问题可能在哪里.
完全例外
FluentNHibernate.Cfg.FluentConfigurationException : An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.
----> FluentNHibernate.Cfg.FluentConfigurationException : An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.
----> NHibernate.MappingException : Could not compile the mapping document: (XmlDocument)
----> NHibernate.MappingException : Could not determine …Run Code Online (Sandbox Code Playgroud) 我有一个ASP.NET MVC操作,通过HttpWebRequest将GET请求发送到另一个服务器.我想在新请求中包含原始操作请求中的所有cookie.原始请求中的某些System.Web.HttpCookies具有空域值(即""),这显然不会导致任何问题.当我使用每个cookie的名称,值,路径和域创建System.Net.Cookie并将其添加到请求的CookieContainer时,我收到此错误:
"System.ArgumentException:参数'{0}'不能是空字符串.参数名称:cookie.Domain"
这里有一些代码会抛出相同的错误(添加cookie时):
var request = (HttpWebRequest)WebRequest.Create("http://www.whatever.com");
request.Method = "GET";
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add ( new Cookie ( "MyCookieName", "MyCookieValue", "/", "") );
Run Code Online (Sandbox Code Playgroud)
编辑
我有点用"localhost"的域,而不是从原来的HttpCookie空或空字符串值修正了这个.那么,为什么空域不适用于CookieContainer? 并且HttpCookie是否使用空值来表示localhost,或者我是否需要为此问题找到另一个修复程序?
我的团队有一个带RESTful API的网站.我们正在进行负载测试,因此我们构建了一个小型控制台应用程序来处理请求.此控制台应用程序不会设置用户代理字符串,这会导致我们的API出错,因为它是我们数据库中的必填字段.
那么,如果请求中不包含用户代理,我是否应该使API更加强大并且只使用默认字符串(即"未知")?或者,我应该在这种情况下返回400 Bad Request响应吗?我知道要么可能,但我正在寻找标准的方法来做到这一点.
是否有任何跨浏览器的斜体方式select options?
使用以下CSS和HTML,FireFox以斜体显示第二个选项,但不显示第三个选项.
IE 7或Safari中没有任何选项用斜体显示.
<style>
option.bravo
{
font-style: italic;
}
</style>
<select>
<option>Alpha</option>
<option class="bravo">Bravo</option>
<option><i>Charlie</i></option>
<select>
Run Code Online (Sandbox Code Playgroud)
假设这是不可能的,我是否正确?
我有一个Django项目,它使用Celery来运行异步任务.我在Windows XP机器上进行开发.
启动我的Django服务器(python manage.py runserver 80)工作正常,但尝试启动Celery守护进程(python manage.py celeryd start)失败,出现以下错误:
ImportError:无法导入设置'src.settings'(是否在sys.path上?是否有语法错误?):没有名为src.settings的模块
sys.path包含'C:\ development\SpaceCorps\src',所以我不确定为什么它找不到这个模块.
这是启动守护进程的完整输出:
C:\development\SpaceCorps\src>python manage.py celeryd start
[2010-07-23 18:29:31,456: WARNING/MainProcess] ?[1;33mcelery@mike-laptop v2.0.1 is starting.?[0m
[2010-07-23 18:29:31,456: WARNING/MainProcess] ?[1;33mC:\Program Files\Python26\lib\site-packages\celery-2.0.1-py2.6.egg\celery\bin\celeryd.py:206: UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in a production environment!
warnings.warn("Using settings.DEBUG leads to a memory leak, "?[0m
[2010-07-23 18:29:31,456: WARNING/MainProcess] ?[1;33mConfiguration ->
. broker -> amqp://guest@localhost:5672/
. queues ->
. celery -> exchange:celery (direct) binding:celery
. concurrency -> …Run Code Online (Sandbox Code Playgroud) c# ×2
python ×2
rest ×2
.net-3.5 ×1
appdomain ×1
asp.net-mvc ×1
celery ×1
css ×1
django ×1
html ×1
html-select ×1
nhibernate ×1
pickle ×1
roles ×1
settings ×1
user-agent ×1
web-services ×1