好了-我甚至不能确定该术语是正确的-和我敢肯定有必然成为这个术语-但我会尽我所能来解释.这不是一个十字架产品,结果的顺序绝对至关重要.
鉴于:
IEnumerable<IEnumerable<string>> sets =
new[] {
/* a */ new[] { "a", "b", "c" },
/* b */ new[] { "1", "2", "3" },
/* c */ new[] { "x", "y", "z" }
};
Run Code Online (Sandbox Code Playgroud)
其中每个内部可枚举表示生成一组连接的指令,如下所示(此处的顺序很重要):
set a* = new string[] { "abc", "ab", "a" };
set b* = new string[] { "123", "12", "1" };
set c* = new string[] { "xyz", "xy", "x" };
Run Code Online (Sandbox Code Playgroud)
我想生成有序连接,如下所示:
set final = new string { a*[0] + b*[0] + c*[0], …Run Code Online (Sandbox Code Playgroud) 我花了很长时间从RESTful服务添加身份验证等角度学习如何自定义WCF; 我构建了一些自定义服务主机,然后添加了使用IOC容器来实际创建服务实例等的功能.
我们有iPhone/iPad应用程序以及其他一些小工具类型(技术术语!)现在使用这些(i-platform上的XML,基于浏览器的JSON),我对我们的性能和易用性非常满意可以添加新的操作等
我学会了DataContract序列化程序的所有缺陷(现在在隔离的情况下使用它们来读取/写入WCF之外的对象)以及在那个陡峭的学习曲线之后,但是现在我们拥有它们,我对它们都非常满意.
现在我们有了一系列新的Web项目,我抓住了使用MVC的机会 - 并对此印象深刻; 模特绑定,特别是真正踢屁股.
我现在正在为这些Web项目寻找类似的RESTful api(它们都是类似的站点,但不同的品牌和业务逻辑的微小变化取决于自定义需求).最初,我预计WCF上的所有这些工作都会让我们处于有利地位 - 但MVC有自己的RESTful XML/JSON开发路径,现在我已经陷入了两者之间.
如果您正在编写MVC站点,您是否会使用WCF来实现其REST API?
我将抛弃一个使用WCF的参数 - 正确编写后,它可以被隔离以作为Windows服务运行而无需Web服务器.然而,这似乎是一个绝望的情况!
更新
我应该说我现在已经使用MVC 2和3实现了3个独立的大型REST服务,并且很高兴能够使用它.我已经编写了模型绑定器来包装WCF的DataContractSerializer for XML,当然JSON支持就好了.我现在不会回去.
我想过几种方法,但我想得到社区的看法.我有一种感觉,答案非常简单 - 我不害怕看起来很愚蠢(我的孩子很久以前就把这种恐惧从我身上带走了!)
我正在使用MVC2编写XML REST Web服务.Web服务的使用者将接收和发送的所有XML类型都由简单但广泛的XSD管理,并且这些参数将通过自定义默认模型绑定器和值提供程序从请求正文中的xml绑定.
我有很多控制器,每个都有很多动作方法(不过量 - 只是'很好';)) - 几乎在所有情况下,这些动作方法都将接受所有引用类型的模型类型.
在几乎每种情况下,调用者都不会提供这些参数值,并且"The parameter {name} type:{ns:type} is required"因此可以发送回标准错误消息.
我想要做的是能够在执行操作方法之前验证参数是否为空; 然后返回一个表示客户端错误的ActionResult(为此我已经有了一个XMLResult类型),而action方法本身不必验证参数本身.
所以,而不是:
public ActionResult ActionMethod(RefType model)
{
if(model == null)
return new Xml(new Error("'model' must be provided"));
}
Run Code Online (Sandbox Code Playgroud)
就像是:
public ActionResult ActionMethod([NotNull]RefType model)
{
//model now guaranteed not to be null.
}
Run Code Online (Sandbox Code Playgroud)
我知道这正是MVC可以实现的那种交叉.
在我看来,基本控制器覆盖OnActionExecuting或自定义ActionFilter是最有可能的方式.
我还希望能够扩展系统,以便它自动获取XML模式验证错误(在自定义值提供程序绑定期间添加到ModelState),从而阻止操作方法继续,如果任何参数值不能正确加载,因为XML请求格式错误.
我用一大堆有问题的背景开始这个问题; 架构背后的接口和基本原理.
然后我意识到 - "这就是这样 - 保持简单并达到目的".
所以这里.
我有一个这样的课:
public class AGenericType<T> : AGenericTypeBase
{
T Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当然,.Net允许我这样做:
AGenericType<AGenericType<int>> v;
Run Code Online (Sandbox Code Playgroud)
但是,在使用环境中AGenericType<T>,以同样的方式执行此操作是无稽之谈,因为这样做是无意义的:
Nullable<Nullable<double>> v;
Run Code Online (Sandbox Code Playgroud)
我希望能够做的是限制这种泛型类型,这样就不可能创建这样的实例,甚至在T派生它时也会声明对类型的引用AGenericTypeBase- 最好是在编译时.
现在一个有趣的事情是Nullable<T>我在这里给出的例子确实会产生编译器错误.但我无法看到如何Nullable<T>限制T非Nullable<T>类型 - 因为Nullable<T>是一个结构,并且我能找到的唯一通用约束(即使在IL中,它通常会产生编译器机密,就像那些带有委托的那些)where T:struct.所以我认为一个人必须是编译器黑客(编辑:请参阅下面的@Daniel Hilgarth的回答+评论,以便对此进行一些探索).编译器黑客当然不能重复!
至于我自己的方案中,IL和C#不容许负断言约束是这样的:
public class AGenericType<T> : where !T:AGenericTypeBase
Run Code Online (Sandbox Code Playgroud)
(注意约束中的'!')
但我可以使用哪种替代方案?
我想到了两个:
1)在构造函数中生成的运行时异常AGenericType<T>:
public AGenericType(){
if(typeof(AGenericBase).IsAssignableFrom(typeof(T)))
throw new InvalidOperationException();
}
Run Code Online (Sandbox Code Playgroud)
但这并不能真正反映错误的本质 …
我在ASP.NET MVC 4 RC Web API中得到了我认为是一个奇怪的绑定问题.我有一个方法来接受来自客户端的帖子请求.问题是,当调用post方法时,没有任何参数是绑定的,我到达了抛出线上的断点并且名称,email都是null.如果我在JavaScript中将请求的类型更改为GET,则使用参数绑定调用下面的Get函数.
为什么参数无法为Post方法绑定,我该如何解决这个问题?
send: function(evt) {
evt.preventDefault();
$.ajax( {
url: '/api/person',
data: this.model.toJSON(),
type: "POST",
dataType: "json",
success: function(data) {
console.log("Success");
},
error: function(data) {
console.log("Error");
}
});
}
Run Code Online (Sandbox Code Playgroud)
以下是控制器操作:
public void Get(string name, string email) {
throw new NotImplementedException();
}
public void Post(string name, string email) {
throw new NotImplementedException();
}
Run Code Online (Sandbox Code Playgroud)
笔记:
这是VS 2008和.Net 3.5.
我使用自定义部署项目脚本,类似于发布右键单击菜单,但我已经自定义了文件重命名和各种其他零碎.它工作得非常好,并且大大简化了发布过程.
我本周末在我们的一个现场网站上发现了一个问题,如果该网站被预编译就会被阻止(长篇故事).
所以我一直在玩AspNetCompiler MSBuild Task(使用PhysicalPath属性指向中间发布文件夹)到部署脚本中,我有一个关于'VirtualPath'选项的问题.
尽管在此预部署阶段该网站不在IIS中,但您仍需要为"VirtualPath"属性提供值.我在这里看到,aspnet_compiler.exe上的关联-v开关使用此值来解析编译期间整个站点中使用的"〜"有根虚拟路径.
所以,我认为这意味着你在这里传递的任何东西必须是部署时应用程序的虚拟根,否则它将无法工作.
但是,我试过这个,在这个选项中传递类似'/ fake/fake'之类的内容,然后通过app-rooted url而不是相对来改变我的一个主页面来引用一个css,它甚至在部署时仍然有效到'/ site'的虚拟路径而不是'/ fake/fake'.
那么对此有什么明确的答案呢?我是否需要担心此VirtualPath值与IIS中站点的最终部署位置完全相同?我希望不是,因为我真的不希望我的部署项目知道目标Web服务器的虚拟层次结构,以防它需要更改.
我的网站主要是通过Asp.Net Web API公开的一套Web服务.还有一些页面,旨在支持用Razor(以及隐式的Asp.Net MVC 4)编写的Web服务(测试等).
对于webservices的XML版本,我有一个模式导出操作(使用XsdDataContractExporter),这是由我的标准API路由选择的(尽管注意 - 我已经颠覆了Web API和Pages的优先级):
//page routes
routes.MapRoute(
"Default", // Route name
"pages/{controller}/{action}/{id}", // URL with parameters
new { controller = "Home",
action = "Index",
id = UrlParameter.Optional
} // Parameter defaults
);
//an additional route for my Schema controller action
routes.MapHttpRoute("XSD", "schema.xsd",
new { controller = "schema" });
//API Catch-all Route
routes.MapHttpRoute("APIMain", "{controller}/{id}",
new { id = RouteParameter.Optional });
Run Code Online (Sandbox Code Playgroud)
现在在剃刀页面上,我想发出一个指向"友好"架构URL的链接~/Schema.xsd.预测路线发现的问题我立即直接按名称命中路线:
@Html.RouteLink("Schema", "XSD");
Run Code Online (Sandbox Code Playgroud)
然而,这只是发出相当于的链接~/.
我已经尝试了一些路由值的其他组合 - 但它看起来像MVC HtmlHelper并且UrlHelper …
我想运行Fiddler来帮助调试我正在开发的可移植API客户端.
在Visual Studio中,在Windows应用商店单元测试项目属性页>调试选项卡上,我已选中"允许本地网络环回"选项.
商店单元测试过程中运行每个Web请求失败了System.Net.Sockets.SocketException:A connection attempt failed because the connected party did not properly respond after a period of time or established connection failed because connected host has failed to respond 127.0.0.1:8888.
我连接的Uri不是本地的 - 而是本地网络上的另一台机器 - 所以这个小提琴环回地址确实来自全局代理设置.
我知道对于Windows应用商店应用,您必须启用环回网络隔离豁免,并勾选UI中列出的每个应用容器(尽管它们都与VS或此单元测试项目无关) - 无济于事.
我也试过在Fiddler中禁用IPv6 - 不知道为什么我认为这可能有用,但它值得一试 - 它也不起作用.
有人有任何想法!?
.net ×6
c# ×5
asp.net-mvc ×3
.net-3.5 ×2
asp.net ×2
algorithm ×1
architecture ×1
fiddler ×1
rest ×1
wcf ×1