在研究一些Web服务时,我遇到了微软称之为OData的这种"新"技术.通过阅读他们在OData中的描述,我很难区分OData和REST-ful Web服务.有人可以帮我理解差异吗?
我收到了错误.有没有其他人得到这个错误?
'/'应用程序中的服务器错误.
无法加载文件或程序集'System.Web.Http,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(来自HRESULT的异常:0x80131040)
描述:在执行当前Web请求期间发生了未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.异常详细信息:System.IO.FileLoadException:无法加载文件或程序集"System.Web.Http,版本= 4.0.0.0,文化=中性公钥= 31bf3856ad364e35"或它的一个依赖.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)
来源错误:
第48行:第49行:第50行:}第51行:第52行:protected void Application_BeginRequest(object sender,EventArgs e)
源文件:d:\ SM\7.4Test\WebAPIServerV2\ThirdPartyWebAPI\Global.asax.cs行:50
程序集加载跟踪:下列信息有助于确定程序集"System.Web.Http,版本= 4.0.0.0,文化=中性公钥= 31bf3856ad364e35"无法加载.
===预绑定状态信息===日志:DisplayName = System.Web.Http,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35(完全指定)LOG:Appbase = file:/// D: /SM/7.4Test/WebAPIServerV2/ThirdPartyWebAPI/日志:初始PrivatePath = D:\ SM\7.4Test\WebAPIServerV2\ThirdPartyWebAPI\bin调用程序集:ThirdPartyWebAPI,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null.===日志:此绑定在默认加载上下文中启动.日志:使用应用程序配置文件:D:\ SM\7.4Test\WebAPIServerV2\ThirdPartyWebAPI\web.config日志:使用主机配置文件:C:\ Users\michalc\Documents\IISExpress\config\aspnet.config日志:使用机器配置来自C:\ Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config的文件.日志:后策略引用:System.Web.Http,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35日志:尝试下载新的URL文件:/// C:/Windows/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/9184b2ea/c6d4b139/System.Web.Http.DLL.日志:尝试下载新的URL文件:/// C:/Windows/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/9184b2ea/c6d4b139/System.Web.Http/System.Web.Http .DLL.日志:尝试下载新的URL文件:/// D:/SM/7.4Test/WebAPIServerV2/ThirdPartyWebAPI/bin/System.Web.Http.DLL.警告:比较程序集名称导致不匹配:主要版本错误:无法完成程序集的设置(hr = 0x80131040).探测终止.试图下载新的URL文件:/// C:/Windows/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/9184b2ea/c6d4b139/System.Web.Http/System.Web.Http.DLL .日志:尝试下载新的URL文件:/// D:/SM/7.4Test/WebAPIServerV2/ThirdPartyWebAPI/bin/System.Web.Http.DLL.警告:比较程序集名称导致不匹配:主要版本错误:无法完成程序集的设置(hr = 0x80131040).探测终止.试图下载新的URL文件:/// C:/Windows/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/9184b2ea/c6d4b139/System.Web.Http/System.Web.Http.DLL .日志:尝试下载新的URL文件:/// D:/SM/7.4Test/WebAPIServerV2/ThirdPartyWebAPI/bin/System.Web.Http.DLL.警告:比较程序集名称导致不匹配:主要版本错误:无法完成程序集的设置(hr …
我正在设计一个分布式应用程序,它将包含RESTful服务和各种客户端(Silverlight,iOS,Windows Phone 7等).现在我正在确定应该使用哪种技术来实现我的服务,WCF数据服务(OData)或ASP.NET MVC 4推出的新ASP.NET Web API.
我在网上看了几个关于每个的演示文稿,现在我倾向于WCF数据服务,主要是因为URI内置的过滤机制和本机超媒体功能.我能看到的唯一缺点是Atom Pub规范的详细程度与POX相反.
在作出决定之前,我对这两项技术有什么了解吗?为什么有人会选择基于WCF数据服务的ASP.NET Web API?
安装Microsoft ASP.NET Web API OData包5.0.0-rc1预发布后,我最终得到以下异常:
无法加载文件或程序集'System.Web.Http,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)
我的MVC 4项目是全新的,非常小,没什么特别之处.我的目标是.NET framework 4.5
我需要这个nuget包来使用Delta类实现PATCH (当我使用包的版本4.0.0.0时,Delta类不起作用).
我该如何解决这个问题?
在GAC中,我有System.Web.Http的5.0.0.0版
gacutil -l System.Web.Http全局程序集缓存包含以下程序集:System.Web.Http,Version = 5.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35,processorArchitecture = MSIL
在Visual Studio中,当我浏览程序集时,System.Web.Http的给定版本是4.0.0.0(为什么?)
在我的项目中,对System.Web.Http的引用
我试图在Web.config中将redirect v 4.0.0.0绑定到5.0.0.0
<dependentAssembly>
<assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="4.0.0.0-4.0.0.0" newVersion="5.0.0.0" />
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud)
但它给了我另一个例外:
通过方法'System.Web.Http.GlobalConfiguration..cctor()'尝试访问字段'System.Web.Http.GlobalConfiguration.CS $ <> 9__CachedAnonymousMethodDelegate2'失败. …
我必须使用Web服务取得的WebAPI由ASP .NET MVC提供4.我知道其中的WebAPI自动工作在顶部层处理的OData查询(例如$filter
,$top
,$skip
),但如果我想自己处理过滤?
我不是简单地从我的数据库返回数据,但我有另一个层添加了一些属性,进行了一些转换等等.因此查询我的所有数据,转换它们并将它们返回到WebAPI类进行OData过滤不仅仅是好的足够.它当然非常慢,通常是一个糟糕的想法.
那么有没有办法将OData查询参数从我的WebAPI入口点传播到我调用的函数来获取和转换数据?
例如,/api/people?$skip=10&$top=10
要调用服务器的GET :
public IQueryable<Person> get() {
return PersonService.get(SomethingAboutCurrentRequest.CurrentOData);
}
Run Code Online (Sandbox Code Playgroud)
并在PersonService
:
public IQueryable<Person> getPeople(var ODataQueries) {
IQueryable<ServerSidePerson> serverPeople = from p in dbContext.ServerSidePerson select p;
// Make the OData queries
// Skip
serverPeople = serverPeople.Skip(ODataQueries.Skip);
// Take
serverPeople = serverPeople.Take(ODataQueries.Take);
// And so on
// ...
// Then, convert them
IQueryable<Person> people = Converter.convertPersonList(serverPeople);
return people;
}
Run Code Online (Sandbox Code Playgroud) 我有一个OData服务,我试图通过ID列表过滤; SQL等价物将是这样的:
SELECT * FROM MyTable WHERE TableId IN (100, 200, 300, 400)
Run Code Online (Sandbox Code Playgroud)
我想要过滤的属性是作为Int32键入的.我尝试了以下内容,它给出了一个错误"运算符'添加'与操作数类型'Edm.String'和'Edm.Int32'不兼容":
string ids = ",100,200,300,400,";
from m in provider.Media where ids.Contains("," + t.media_id + ",")
Run Code Online (Sandbox Code Playgroud)
以及
string ids = ",100,200,300,400,";
from m in provider.Media where ids.Contains("," + t.media_id.ToString() + ",")
Run Code Online (Sandbox Code Playgroud)
和
string ids = ",100,200,300,400,";
from m in provider.Media where ids.Contains("," + Convert.ToString(t.media_id) + ",")
Run Code Online (Sandbox Code Playgroud)
和
string ids = ",100,200,300,400,";
from m in provider.Media where ids.Contains(string.Concat(",", t.media_id, ","))
Run Code Online (Sandbox Code Playgroud)
如您所见,目前我正在使用LINQ来查询服务.
有没有办法,我可以做我正在尝试的,或者我是不是构建文本过滤器和使用AddQueryOption,并迭代列表并手动添加"或media_id eq 100"条款?
我想知道是否有任何OData Python库可用于生成和使用OData?有不同语言的实现:http: //www.odata.org/libraries/
但到目前为止我找不到Python.顺便说一下,我不是指IronPython.该库应该只在Python中可用.
背景:
我有一个非常大的OData模型,目前正在使用WCF数据服务(OData)来公开它.但是,微软已经表示WCF数据服务已经死亡,Web API OData就是他们的目标.
所以我正在研究如何使Web API OData与WCF数据服务一起工作.
问题设置:
模型的某些部分不需要保护,但有些部分需要保护.例如,客户列表需要安全性来限制谁可以读取它,但我有其他列表,如产品列表,任何人都可以查看.
Customers实体有许多可以访问它的关联.如果您计算2个级别的关联,那么可以通过关联(通过关联)获得数百种方式.例如Prodcuts.First().Orders.First().Customer
.由于客户是我系统的核心,因此您可以从大多数实体开始,最终将您的方式与客户列表相关联.
WCF数据服务有一种方法可以通过以下方法为特定实体提供安全性:
[QueryInterceptor("Customers")]
public Expression<Func<Customer, bool>> CheckCustomerAccess()
{
return DoesCurrentUserHaveAccessToCustomers();
}
Run Code Online (Sandbox Code Playgroud)
当我看到Web API OData时,我没有看到这样的东西.另外,我非常担心,因为我正在制作的控制器在跟随关联时似乎没有被调用.(意思是我不能把安全放在CustomersController
.)
我担心我将不得不尝试以某种方式列举协会如何获得客户并为每个客户提供安全性的所有方式.
问题:
有没有办法将安全性放在Web API OData中的特定实体上? (无需枚举所有可能以某种方式扩展到该实体的关联?)
有没有办法通过指定"日期大于xxxxx"过滤器来返回OData中的一系列记录...但是使用之前从OData Feed获得的日期?
使用案例:假设我想构建一个显示最近完成的在线订单列表的网页.这就是我的目标:
我正在努力的是指定日期"大于"过滤器.出于某种原因,OData中的日期过滤器似乎与OData自己的本机日期格式不太匹配.我是否需要将最初获得的日期转换为可用于过滤的其他格式?
我想做这样的事情:
[http://mydomain/Services/v001.svc/Orders?$filter=close_dt gt 1338336000000][1]
Run Code Online (Sandbox Code Playgroud)
仅供参考:我正在使用V2
我需要缓存在ASP.NET Web API OData服务中可用的大部分是静态的(可能每天更改1次)的对象集合.此结果集用于跨调用(意味着不是特定于客户端调用),因此需要在应用程序级别缓存它.
我做了一些关于'在Web API中缓存'的搜索,但所有结果都是关于'输出缓存'.这不是我在这里寻找的.我想缓存一个'People'集合,以便在后续调用中重用(可能有一个滑动到期).
我的问题是,由于这仍然只是ASP.NET,我是否使用传统的应用程序缓存技术将此集合持久存储在内存中,或者我还需要做些什么呢?此集合不直接返回给用户,而是通过API调用用作OData查询的幕后源.我没有理由在每次通话时都去数据库,以便在每次通话时获得完全相同的信息.每小时到期应该足够了.
任何人都知道如何在这种情况下正确缓存数据?
odata ×10
rest ×3
c# ×2
caching ×1
collections ×1
filter ×1
linq ×1
python ×1
wcf ×1
web-services ×1