我正在开发一个小型的rails网站,允许一些用户上传图像,其他用户可以看到它们.我开始使用CarrierWave和S3作为存储介质,一切都运行良好,但后来我想尝试使用CanFront.我首先distribution在我的S3存储桶中添加了一个,然后将我正在使用的CarrierWave配置更改为:
CarrierWave.configure do |config|
config.storage = :fog
config.fog_credentials = {
:provider => 'AWS', # required
:aws_access_key_id => ENV['S3_ACCESS_KEY_ID'], # required
:aws_secret_access_key => ENV['S3_SECRET_ACCESS_KEY'], # required
:region => 'eu-west-1',
}
config.asset_host = 'http://static.my-domain.com/some-folder'
config.fog_public = true # optional, defaults to true
config.fog_attributes = {'Cache-Control'=>'max-age=315576000'} # optional, defaults to {}
end
Run Code Online (Sandbox Code Playgroud)
我应该提一下,它http://static.my-domain.com是一个指向CloudFront端点(some-id.cloudfront.net)的CNAME条目.结果是图片显示正确,URL看起来像这样:http://static.my-domain.com/some-folder/uploads/gallery_image/attachment/161/large_image.jpg但每当我尝试上传照片或者就此而言,获得上传附件的大小时,我会得到以下异常:
Excon::Errors::MovedPermanently: Expected(200) <=> Actual(301 Moved Permanently)
response => #<Excon::Response:0x007f61fc3d1548 @data={:body=>"",
:headers=>{"x-amz-request-id"=>"some-id", "x-amz-id-2"=>"some-id",
"Content-Type"=>"application/xml", "Transfer-Encoding"=>"chunked",
"Date"=>"Mon, 31 Mar 2014 21:16:45 GMT", "Connection"=>"close", "Server"=>"AmazonS3"}, …Run Code Online (Sandbox Code Playgroud) 我最近从MVC4 beta更新到了RC,并遇到了一个WebApi项目的小问题.我注意到的第一件事就是ServiceResolver被删除了.在删除之前,我使用它以下列方式注册自定义模型绑定提供程序:
IEnumerable<object> modelBinderProviderServices = GlobalConfiguration.Configuration.ServiceResolver.GetServices(typeof(ModelBinderProvider));
List<Object> services = new List<object>(modelBinderProviderServices) { new CustomDynamicObjectModelBinderProvider() };
GlobalConfiguration.Configuration.ServiceResolver.SetServices(typeof(ModelBinderProvider), services.ToArray());
Run Code Online (Sandbox Code Playgroud)
利用此模型绑定程序提供程序的操作具有以下签名:
[HttpPut]
public void Put(CustomDynamicObject model)
Run Code Online (Sandbox Code Playgroud)
我尝试用以下代码替换旧代码,但没有结果:
GlobalConfiguration.Configuration.Services.Add(typeof(ModelBinderProvider), new CustomDynamicObjectModelBinderProvider());
Run Code Online (Sandbox Code Playgroud)
当我尝试将数据PUT到给定的动作时,不调用模型提供者的GetBinder方法,并且模型参数设置为null.通过将Acion /方法的签名更改为以下内容,我能够使用ModelBinder属性使操作使用想要的模型绑定器
[HttpPut]
public void Put([ModelBinder(typeof(CustomDynamicObjectModelBinderProvider))] CustomDynamicObject model)
Run Code Online (Sandbox Code Playgroud)
虽然这有效但我真的不想在我的所有控制器/动作中使用这种语法.
我想我应该提一下我的模型绑定器提供程序继承自:
System.Web.Http.ModelBinding.ModelBinderProvider
Run Code Online (Sandbox Code Playgroud)
我这样说是因为我看到以下命名空间中有另一个ModelBinderProvider类:
Microsoft.Web.Mvc.ModelBinding
Run Code Online (Sandbox Code Playgroud)
回顾一下:如何在MVC4 RC WebApi中注册自定义模型绑定器?