如何设置使用AttributeRouting时使用的默认控制器,而不是WebAPI使用的默认RouteConfiguration.即删除注释的代码部分,因为使用AttribteRouting时这是多余的
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
//routes.MapRoute(
// name: "Default",
// url: "{controller}/{action}/{id}",
// defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
//);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我评论上面的部分并尝试运行webapi应用程序,我会收到以下错误,因为没有定义默认的Home控制器/操作. HTTP错误403.14 - 禁止Web服务器配置为不列出此目录的内容.
如何通过归属控制器/操作的属性路由指定路由?
编辑:代码示例:
public class HomeController : Controller
{
[GET("")]
public ActionResult Index()
{
return View();
}
public ActionResult Help()
{
var explorer = GlobalConfiguration.Configuration.Services.GetApiExplorer();
return View(new ApiModel(explorer));
}
}
Run Code Online (Sandbox Code Playgroud) 我按照此处列出的想法创建了一些集成测试:http: //www.strathweb.com/2012/06/asp-net-web-api-integration-testing-with-in-memory-hosting/
当我尝试从手工制作的HttpConfiguration对象注册路由时,我收到以下错误:"路由模板'api/Contacts/{id}'的路径上的约束条目'inboundHttpMethod'必须具有字符串值或者是一种实现'IHttpRouteConstraint'的类型."
示例代码:控制器:
[RoutePrefix("api")]
public class ContactsController : ApiController
{
[GET("Contacts/{id}",RouteName="GetContactsById")]
public ContactDTO Get(int id)
{
return new ContactDTO{ ID =1, Name="test"};
}
}
}
Run Code Online (Sandbox Code Playgroud)
TestClass(MSTest):
[TestClass]
public class ContactsTest
{
private string _url = "http://myhost/api/";
private static HttpConfiguration config = null;
private static HttpServer server = null;
private HttpRequestMessage createRequest(string url, string mthv, HttpMethod method)
{
var request = new HttpRequestMessage();
request.RequestUri = new Uri(_url + url);
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(mthv));
request.Method = method;
return request;
}
private …Run Code Online (Sandbox Code Playgroud) 有没有办法让nuget使用"nuget pack"获取.csproj中包含的readme.txt文件,以便在安装软件包时,readme.txt文件会在VS中自动打开?
当我手动创建nuspec并列出readme.txt时,readme.txt文件与nuspec文件位于同一级别,在nuspec上运行nuget pack是正确的.
在.csproj上使用nuget pack时,虽然行为使得项目的自述文件包含在"Content"文件夹中.在这种情况下,是否有办法获取nuget pack以包含该部分中的自述文件,以便它的行为与手动创建nuspec并在文件夹的根目录中添加readme.txt相同
我有以下正则表达式验证器来检测输入字符串是否包含HTML /脚本标记,如果是这样,则会导致更改错误:
<asp:TextBox ID="txt" runat="server" />
<asp:RegularExpressionValidator
ControlToValidate="txt"
runat="server"
ID="regexVal"
EnableClientScript="true" Display="Dynamic"
ErrorMessage="Invalid Content"
Text="!"
ValidationExpression=">(?:(?<t>[^<]*))" />
Run Code Online (Sandbox Code Playgroud)
当我运行托管此标记的页面时,我收到一条scipt错误消息"正则表达式中的语法错误".但是,当我使用相同的正则表达式并使用System.Text.RegularExpressions中的Regex类运行它时,一切正常:如下所示:
Regex r = new Regex(">(?:(?<t>[^<]*))");
r.IsMatch(@"<b>This should cause a validation error</b>");
r.IsMatch("this is fine");
Run Code Online (Sandbox Code Playgroud)
我错过了什么
更新:错误似乎发生在WebResource.axd中的以下js函数中:
function RegularExpressionValidatorEvaluateIsValid(val) {
var value = ValidatorGetValue(val.controltovalidate);
if (ValidatorTrim(value).length == 0)
return true;
var rx = new RegExp(val.validationexpression); //this is the line causing the error
var matches = rx.exec(value);
return (matches != null && value == matches[0]);
}
Run Code Online (Sandbox Code Playgroud) 我知道它是Windows PE32,但我也知道.NET中的部署单元是一个程序集,而该程序集又有一个清单,可以由多个托管模块组成.
我的问题是:
1)在构建项目(如类lib或控制台应用程序等)时,如何创建多个托管模块?
2)有没有办法将这个指定给编译器(例如通过项目属性)将源代码文件分区为多个托管模块.如果是这样的话有什么好处?
3)托管模块可以跨组件吗?
4)在编译源代码时是在磁盘上创建单独的文件还是在内存中创建并直接嵌入到程序集中?
编辑:
@乔恩:
对于2):那么,在Visual Studio中编译/构建源总是创建一个托管模块吗?如果是这样,那么我无法理解为什么VS不提供这样做的机制,尽管.NET支持这样做.我同意用不同语言的模块创建程序集是无法管理的.这是.NET允许创建多模块组件的唯一原因吗?我通过C#读取Richter的CLR,模块也可以跨越程序集,这可以帮助减少程序集大小,并通过在第一次调用某些功能时按需下载程序集来减少内存占用,但我不太确定为什么人们想要跨组件跨越模块,为什么不创建一个新的组件,其中隐含在过程中创建一个新模块.你仍然可以获得同样的好处.
项目4)涉及".netmodule"文件.作为VS构建过程的一部分,我没有看到在obj目录中创建的任何".netmodule"文件.我通常注意到.pdb,.dll/.exe和一个*FileListAbsolute文件,因此有关是否为托管模块创建任何单独文件的问题.
编辑:@Jon:以下是CLR通过C#(第3版)的摘录第43页:也许我误读了这个但是听起来我可以按需下载模块(属于程序集的文件).
"例如,程序集可以包含多种类型.您可以将常用类型放在一个文件中,将较不常用的类型放在另一个文件中.如果通过Internet下载部署程序集,则不经常使用的文件如果客户端从不访问类型,则可能不必将类型下载到客户端.例如,专门用于UI控件的独立软件供应商(ISV)可能选择在单独的模块中实现Active Accessibility类型(以满足Microsoft的徽标要求)只有需要额外辅助功能的用户才需要下载此模块.
您可以通过在应用程序的配置文件中指定codeBase元素(在第3章中讨论)来配置应用程序以下载程序集文件.codeBase元素标识指向可以找到所有程序集文件的位置的URL."
我有以下类层次结构
[BsonKnownTypes(typeof(MoveCommand))]
public abstract class Command : ICommand
{
public abstract string Name
{
get;
}
public abstract ICommandResult Execute();
}
public class MoveCommand : Command
{
public MoveCommand()
{
this.Id = ObjectId.GenerateNewId().ToString();
}
[BsonId]
public string Id { get; set; }
public override string Name
{
get { return "Move Command"; }
}
public override ICommandResult Execute()
{
return new CommandResult { Status = ExecutionStatus.InProgress };
}
}
Run Code Online (Sandbox Code Playgroud)
如果我像这样保存命令:
Command c = new MoveCommand();
MongoDataBaseInstance.GetCollection<Command>("Commands").Save(c);
Run Code Online (Sandbox Code Playgroud)
然后查询数据库,我没有看到派生属性持久化.
{"_ id":"4df43312c4c2ac12a8f987e4","_ t":"MoveCommand"} …
是否有通过 REST 对 POST、PUT、PATCH 动词执行 BATCH 操作的最佳实践?
我遵循的当前范例是在所有 3 个操作的主体中指定 JSON 有效负载:
a) POST 返回创建资源的位置
b) PUT / PATCH 如果更新成功则返回 201
对于批处理操作,我打算在有效负载主体中接受 JSON 对象的集合,但我试图确定要返回给客户端的内容。
处理批次时,某些项目的操作可能会成功,但其他项目的操作可能会失败。
考虑到这一点,我的看法是,最好的办法是返回一个对象集合,指示有效负载中每个项目的成功/失败状态。
但这偏离了我在上面(a)和(b)中概述的范例。
相反,向客户端返回表示批处理操作本身 ID 的标识符是否有意义?
然后,客户端将发出后续 GET 以获取其请求的操作的结果。
这种方法听起来合理吗?如果是这样,如果操作尚未完成,则在后续 GET 上阻止客户端是否有意义,或者始终返回最新状态(即客户端请求处理的每个项目的响应集合)是否有意义。
想法/想法/建议?
由于 REST 是一种架构风格,不一定有明确的“指南”,也没有强制要求如何实现 HTTP 动词的操作,因此显然这里没有正确或错误的答案。
我正在寻找一种优雅、自然且直观的解决方案。
处理在循环中创建的订阅的推荐方法是什么?在下面的设计示例中,我将在for循环中生成订阅并将它们添加到a List并通过对它们进行明确的处理.List
这对我来说似乎有点臭,我认为必须有一种更清洁的方法来清理订阅除非GC在运行时处理它们.我是否需要明确处理订阅?
class Program
{
static void Main(string[] args)
{
Func<int, IEnumerable<int>> func = x =>
{
return Enumerable.Range(0, x);
};
List<IDisposable> subsriptions = new List<IDisposable>();
for (int i = 1; i < 10; i++)
{
var observable = func(i).ToObservable().ToList();
var subscription = observable.Subscribe(x => Console.WriteLine(x.Select(y => y.ToString()).Aggregate((s1, s2) => s1 + "," + s2)));
subsriptions.Add(subscription);
}
Console.ReadLine();
subsriptions.ForEach(s => s.Dispose());
}
}
Run Code Online (Sandbox Code Playgroud) 我不太熟悉ESB或Biztalk,如果你已经拥有Biztalk,我试图从EAI的角度来看看最有意义的东西.据我所知,Biztalk是一个消息代理(hub和spoke),ESB模式是一个反代理,其中概念"总线"由各个分布式组件组成,这些组件以某种方式相互通信.消息代理本质上代表单点故障,而不是ESB,其中一个组件发生故障并不会导致整个"总线"失效.另外我的理解是Biztalk是单片式的,因为消息传递,编排是紧密耦合的,并且缩放是有问题的.
如果手头的情况是:
直接使用Biztalk或Biztalk ESB工具包实现ESB功能是否有意义,或者使用适当的ESB实现(例如基于Azure Service Bus的NServiceBus或Service Bus for Windows)是否有意义.使用Biztalk直接实现EAI与使用适当的ESB相比有哪些优缺点.每个应用程序是否会严格依赖Biztalk以及这是否可取?
由于没有正确或错误的答案,我将把这作为一个开放式的讨论.
@StuartLC: 谢谢你的回复.我已经阅读了您发布的几个链接,但仍然没有清楚地了解Biztalk作为ESB解决方案与使用NServiceBus之类的东西是否有意义.两者似乎都以这种或那种方式实现了"ESB"模式.问题是哪一个具有更清洁的实施,更好的开发经验和低的加速时间.到目前为止我的评估(仅来自纯粹的研究)是可以使用Biztalk,但它很痛苦,需要非常专业的开发.技能.延迟和扩展是有问题的,Biztalk最终会被同化到(Azure?)Service Bus和Biztalk SKU这一事实将不复存在.另一方面,像NService总线这样的框架具有相对较低的加速时间,可以很容易地被开发人员接收.具有良好的.NET编程技能,可以与Biztalk轻松连接.考虑到上述情况,即使您目前在内部拥有Biztalk或未来证明自己使用适当的ESB(例如NService Bus),仍然可以使用Biztalk路线吗?
我正在使用ASP.NET Web API将基于SOAP的RPC样式"Web服务"转换为基于JSON的REST Web服务.AddXYZ/UpdateXYZ/RemoveXYZ等方法完全映射到POST/PUT/DELETE的HTTP谓词.是否有任何最佳实践/指导将典型的RPC样式操作(例如"ExecuteXYZ"或"AssignXYZ"样式方法)映射到它的REST对应物?我的看法是这样的操作将映射到相应的URL可寻址资源,例如"ExecuteXYZRequest"和"AssignXYZRequest"
http://myhost/myservice/ExecuteXYZRequest
http://myhost/myservice/AssignXYZRequest
Run Code Online (Sandbox Code Playgroud)
执行"ExecuteXYZ"的请求将转换为POST操作.
获取提交的请求将转换为GET(通常用于获取已提交请求的状态).
http://myhost/myservice/ExecuteXYZRequest/1 <--- 1 is the ID of the request
Run Code Online (Sandbox Code Playgroud)
取消请求(假设它是可取消的)将转换为DELETE
POST不会真正映射到任何东西.
以上听起来像是一个合理的REST实现,还是我完全不在思考?非常感谢思想/指导.
更新 以下是我正在尝试建模的具体示例:Contact和Event实体之间的多对多关系.将联系人的成员资格建模为REST资源的最佳方法是什么,以便可以在事件中添加/删除联系人.在RPC中这将是一个方法,如"AssignContactToEvent",它获取两个实体的ID并建立这两者之间的关系.如何在REST中自然地将其建模为资源.我记得有一个链接和"rel"的概念,但是找不到一个具体的实际例子来说明如何使用Web API对这样的东西进行建模