我想编写一个新的REST样式API并查看ServiceStack并且非常喜欢它.但是,我已经看到Microsoft已经发布了ASP.Net Web API项目,作为新MVC 4 beta的一部分.有没有人看过新的Web API项目?你能给出每个系统的优缺点吗?
我有一个在Windows服务中托管的WCF REST服务,我希望每次响应都发送Access-Control-Allow-Origin HTTP标头(定义为CORS的一部分).
我尝试的解决方案是在IDispatchMessageInspector实现中使用以下内容:
public void BeforeSendReply(ref Message reply, object correlationState)
{
var httpResponse = reply.Properties["httpResponse"] as HttpResponseMessageProperty;
if (httpResponse != null)
{
// test of CORS
httpResponse.Headers["Access-Control-Allow-Origin"] = "*";
}
}
Run Code Online (Sandbox Code Playgroud)
通常这可以工作,但不幸的是我的服务也使用HTTP基本授权,这意味着当请求进入而没有Authorization标头时,WCF会自动发送401响应,要求提供凭据.遗憾的是,在此初始交换期间,WCF不会调用我的IDispatchMessageInspector,因此Access-Control-Allow-Origin标头不会添加到初始交换中.
当我尝试从浏览器调用服务时,会出现此问题.CORS指定仅当源域与Access-Control-Allow-Origin响应头中列出的域匹配时才允许跨源请求(*匹配所有域).不幸的是,当浏览器看到没有Access-Control-Allow-Origin标头的初始401响应时,它会阻止访问(根据相同的源策略).
有没有办法在WCF自动发送的初始401响应中添加标头?
我目前正在使用WCF实现一个Silverlight应用程序,用于客户端和服务器之间的通信.我听说使用WCF我们必然会在客户端使用一些Microsoft技术,并且不能轻易地将其替换为"任何东西" - 至少使用WPF的默认SOAP实现.
所以我的问题是:
ServiceStack服务中是否有任何机制可以返回流/大二进制数据?WCF的MTOM支持很难但在返回大量数据时却没有文本转换开销.
我刚刚开始使用ServiceStack这是一个了不起的库.
但是,我有一个业务需求,我们必须返回xml和json,其中xml必须是特定格式.
例如,我们现有的客户期望xml的格式:
<service name="service1" type="audio" .../>
Run Code Online (Sandbox Code Playgroud)
所以基本上是一堆属性.
我知道ServiceStack使用DTO的概念并使用DataContractSerializer返回xml元素而不是上面的表单中的xml属性.
我仍然希望将DTO用于请求(在Accept头中传入application/xml或application/json)然后我可以创建自己的xml字符串或json字符串,然后将它们返回为:
string result = "....xml or json string...";
return new MemoryStream(Encoding.UTF8.GetBytes(result));
Run Code Online (Sandbox Code Playgroud)
其中结果字符串可以是xml字符串或json字符串.
我在fiddler中注意到Content-Type的响应为text/html.
根据我使用的方法,我违反了任何REST原则吗?Content-Type是否会出现问题(text/html)?
如果我使用这种方法,它确实解决了业务需求.
编辑
我发现我可以返回一个httpResult:
return new HttpResult(
new MemoryStream(Encoding.UTF8.GetBytes(result)), "application/xml");
Run Code Online (Sandbox Code Playgroud)
它给出了正确的内容类型.
那么,这是正确的方式,还是如果我沿着这条路走下去,我会遇到什么问题?
创建JSON Web服务的最佳方法是什么?我们有另一个使用Java的团队,他们坚持使用JSON完成所有通信.我更愿意使用WCF而不是任何第三方框架.
我发现这个博客:http://www.west-wind.com/weblog/posts/164419.aspx,它表明微软的实现存在M $特定废话的缺陷.
使用ServiceStack,我只想返回304 Not Modified:
HTTP/1.1 304 Not Modified
Run Code Online (Sandbox Code Playgroud)
但ServiceStack添加了许多其他不需要的(返回带有304代码的HttpResult)标头:
HTTP/1.1 304 Not Modified
Content-Length: 0
Content-Type: application/json
Server: Microsoft-HTTPAPI/2.0
X-Powered-By: ServiceStack/3.94 Win32NT/.NET
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Headers: Content-Type
Date: Tue, 07 Aug 2012 13:39:19 GMT
Run Code Online (Sandbox Code Playgroud)
如何防止输出其他标题?我已经尝试了HttpResult的各种方法,注册了一个虚拟内容类型过滤器,但是它的名字仅暗示控件内容,而不是标题或此处列出的其他内容.我也尝试使用IStreamWriter和IHasOptions实现我自己的IHttpResult派生,结果相同:ServiceStack添加了不需要的标头.
谢谢
更新
能够去除content-type通过使用以下,但有些头依然存在,即content-length,server和date.
public override object OnGet(FaultTypes request)
{
var result = new HttpResult
{
StatusCode = HttpStatusCode.NotModified,
StatusDescription = "Not Modified", // Otherwise NotModified written!
}; …Run Code Online (Sandbox Code Playgroud) 我意识到点击Backbone.Todos示例"清除x已完成的项目"我得到DELETE 405不允许...
我从以前的帮助和文档中了解到,如果我想启用DELETE PUT PATCH ...我需要设置
X-http-method-override : DELETE
如果它是一个表格或jquery.
但我不确定如何在Backbone.Todos示例中完成此操作,因为我是backbone.js的新手.
你能指出如何修复DELETE 405吗?谢谢.
编辑---------------------------------------
我总是可以改变路线......
[Route("/todos/add")] //C - post
[Route("/todos/{id}")] //R - get
[Route("/todos/{id}/edit")] //U - post
[Route("/todos/{id}/delete")] //D - post
Run Code Online (Sandbox Code Playgroud)
所以,只有Post和Get足以完成这项工作.但与以下相比,它看起来并不十分宁静:
[Route("/todos/{id}", "Delete")] //D - delete
Run Code Online (Sandbox Code Playgroud)
可以?
使用新的Service实现,我是否必须为我的所有服务提供Options方法?
使用我的所有服务当前使用的旧ServiceBase方法,OPTIONS在没有Access-Control-Allow-Origin标头的情况下返回OK.
这是一个例子:
https://github.com/JonCanning/SSCors
HelloService使用Service
GoodbyeService使用ServiceBase
我目前正在使用serviceStack来创建托管在MVC Web应用程序中的基于REST的服务.
到目前为止,ServiceStack已经令人惊叹,我已经实现了大部分我想要做的工作.所有这些都适用于IISExpress.
我现在已经转移到IIS 7.5,我在执行PUT时得到400错误,即"找不到请求处理程序".GET工作正常,在IISExpress上PUT和GET都能正常工作.
在IISExpress上,这一切都奏效了.
有任何想法吗?
使用CorsFeature插件,我如何支持多个源域?我不是在说这里的通配符"*".我说的是在传递一个以上的起源的名单:" http://firstdomain.com,http://seconddomain.com ".
servicestack ×8
c# ×3
wcf ×3
.net ×2
cors ×2
backbone.js ×1
iis-7.5 ×1
json ×1
service ×1
wcf-rest ×1