小编And*_*tan的帖子

站点地图应该是*every*url

我有一个网站,其中包含大量(数千或数万)动态网址,以及一些静态网址.

从理论上讲,由于主页上有一些狡猾的搜索引擎优化链接,任何蜘蛛都应该可以通过蜘蛛友好搜索来抓取网站并发现所有动态网址.

鉴于此,我是否真的需要担心花费精力来生成包含所有这些URL的动态站点地图索引,还是应该确保所有主要的静态URL都在那里?

我生成这个的实际方式并不是一个问题 - 我只是质疑实际需要它.

事实上,谷歌常见问题解答(是的,我知道他们不是唯一的搜索引擎!)关于此建议包括站点地图中可能无法通过抓取发现的网址; 基于这一事实,那么,如果您网站中的每个网址都可以从另一个网址访问,那么您网站地图中为精心设计的网站确实需要的唯一网址是您的主页吗?

sitemap seo

8
推荐指数
1
解决办法
3377
查看次数

TFS 2008源代码管理 - 快速销毁所有已删除项目的方法

我有一堆源控制文件夹,我想要摆脱所有不再需要的项目.这些项目已被删除(代码已被移动或重写),因为我们大多数人默认使用"显示已删除的项目"选项,其中一些文件夹现在会显示更多已删除的项目和文件夹以及合法项目.我想确保所有这些冗余代码永远消失 - 因为它绝对不会被要求.这些是从旧版本的分支构建的新项目,目前还没有人使用.

但是,有很多文件分布在多个文件夹中,因此我宁愿避免单独执行每个文件.我也在命令行,而不是使用API​​.

我知道最终我需要这个tf destroy命令.

我也知道tf dir [wildcard] /recursive /deleted将返回路径中的所有已删除项目(不幸的是与所有合法项目一起).

谁能想到一个快速做到这一点的好方法?

我想到了两个解决方案:

1)获取dir命令的输出并找到之后的所有项目:Xnnnnnnn- 这些是已删除的项目; 然后简单地吐出一堆tf destroy调用,或构造一个响应文件(虽然不确定这个位).这听起来像Powershell的一个潜在用途,但实际上还没有做任何事情......

2)准备好所有项目,然后简单地从TFS中销毁它们,然后重新添加它们,这样只有所需的东西才能在TFS中.但是,这确实消除了可能有用的分支关系,因为有一段时间我将不得不维护这些库中的一些版本(升级前和升级后).不理想,但我无能为力.

显然,选项2是一个骗子,但它会起作用 - 我理想情况下就像一个可重用的脚本,可以在未来用于TFS中的任何文件夹(其他几个团队还有其他长期项目可以用于完全清除!).

提前致谢.

.net c# version-control tfs visual-studio-2008

8
推荐指数
1
解决办法
2307
查看次数

Delegate.CreateDelegate不会包含返回值 - 故意还是省略?

我有一个静态方法:

public class Example
{
    //for demonstration purposes - just returns default(T)
    public static T Foo<T>() { return default(T); }
}
Run Code Online (Sandbox Code Playgroud)

我需要能够使用Type可能很多的参数调用来调用它,所以我的标准模式是创建一个线程安全的委托缓存(ConcurrentDictionary在.Net 4中使用),它Foo<T>使用正确的方法动态调用该方法T.但是,如果没有缓存,代码是这样的:

static object LateFoo(Type t) 
{ 
  //creates the delegate and invokes it in one go
  return (Func<object>)Delegate.CreateDelegate( 
    typeof(Func<object>), 
    typeof(Example).GetMethod("Foo", BindingFlags.Public | BindingFlags.Static). 
      MakeGenericMethod(t))(); 
}
Run Code Online (Sandbox Code Playgroud)

这不是我第一次这样做 - 而且在过去我使用Expression树来构建和编译代理来调用目标方法 - 确保返回类型转换和装箱从int - > object(for示例)处理正确.

更新 - 有效的表达式代码示例

static object LateFoo(Type t)
{
  var method = typeof(Example)
               .GetMethod("Foo", BindingFlags.Public | BindingFlags.Static)
               .MakeGenericMethod(t); 
  //in …
Run Code Online (Sandbox Code Playgroud)

.net c#

8
推荐指数
3
解决办法
865
查看次数

使用MSDeploy将站点的*new*DestinationBinding添加到包中

我正在使用带有MSDeploy的临时模型将我们的几个站点部署到Web场.这些站点仅在暂存框中的IIS中配置,然后使用MSDeploy从头开始构建目标Web服务器.

登台框为将要生效的站点使用自己的绑定(即没有标头条目,不同的IP /端口和没有主机标头).当我部署它时,我首先有一个xml文件用于准备一个参数化包(使用-declareParamFile开关),它声明参数如下:

<parameters>
  <parameter name="site1">
    <parameterEntry kind="DestinationBinding" scope="Site1" match=":17000:" />
  </parameter>
</parameters>
Run Code Online (Sandbox Code Playgroud)

因此,在上面的XML中,您可以看到暂存的站点托管在端口17000上,因为该match属性设置为匹配具有该值的绑定.

当我然后部署到每个实时站点时,我使用不同的参数XML来指定该机器的正确主机头和IP - 我使用-setParamFile开关应用它.这是其中一个例子.

<parameters>
  <setParameter name="site1" value="[ip_addr]:[port]:[host_header]"/>
</parameters>
Run Code Online (Sandbox Code Playgroud)

因此,因为原始参数被声明为匹配其中一个已知绑定 - 我可以将该绑定替换为我实际希望它在每个实时服务器上的绑定.

我现在要做的是部署网站并添加新的目标绑定,其中包含我们拥有的不同顶级域名(即site.com,site.co.uk,site.ca等),所有这些都绑定在同一个IP地址上和港口.

想要这样做的原因是:

  • 我们有一个我们想要部署的新站点,需要一个不同的主机名,但是我们不想给它自己的IP地址(在这里耗尽IP!)但是让它共享一个现有站点的IP.服务器已经有了.
  • 这意味着将特定的主机名绑定添加到已经存在的站点,而不是让它响应任何主机名.
  • 我们目前有四个域名指向现有站点的负载均衡IP(.com,.us,.ca,.com.au).目前它的工作原理是因为Web服务器不关心主机头 - 但是当新站点使用相同的IP时,它将会,并且其他域名将不再起作用.

问题是我认为似乎没有任何方法可以添加此类信息.我尝试setParameter在第二个XML中添加多个元素,但这只是重复覆盖绑定的效果,最后一个作为最终的赢家.

一个解决方案是我为登台框中的每个站点添加"占位符"绑定,它代表每个域名,端口等的目标外部绑定; 然后我修改两个参数文件来替换那些与真实绑定的绑定.

但对我来说,这感觉是完全错误的 - 这将模拟升级盒以适应实时部署; 它应该是相反的方式.

是否可以使用MSDeploy 实际添加站点绑定(如果是,如何?),还是仅支持替换?

deployment iis iis-7 msdeploy iis-7.5

7
推荐指数
1
解决办法
1775
查看次数

在msdeploy中指定项目名称

我在一个解决方案中有两个Web项目,我想使用msbuild和WebDeploy来部署它们(这通过CI服务器发生).

目前,我正在运行命令行:

C:\ProjectFolder>msbuild <solution>.sln
    /p:Configuration=<Release>
    /p:OutputPath=bin
    /p:DeployOnBuild=True
    /p:DeployTarget=MSDeployPublish
    /p:MsDeployServiceUrl=https://<ServerUrl:port>/msdeploy.axd
    /p:username=<user>
    /p:password=<password>
    /p:AllowUntrustedCertificate=True
    /p:DeployIisAppPath=<SiteName>
    /p:MSDeployPublishMethod=WMSVC
Run Code Online (Sandbox Code Playgroud)

这按预期部署了一个项目.但是我如何部署另一个呢?在这个命令行中没有任何地方我指定了一个项目名称 - 为什么它选择一个项目来部署另一个项目?

理想情况下,我可以使用相同的命令部署两个项目,例如

...

    /p:Project=Project1
    /p:DeployIisAppPath=<SiteName>/Project1
    /p:Project=Project2
    /p:DeployIisAppPath=<SiteName>/Project2
Run Code Online (Sandbox Code Playgroud)

但我怀疑这是可能的.或者,我只想知道如何在命令行中指定项目名称.

msbuild msdeploy command-line-arguments

7
推荐指数
1
解决办法
5738
查看次数

ASP.Net:添加要监视的额外文件以触发AppDomain回收

我的所有Asp.Net网站都使用由XML文件驱动的单独配置系统,该系统负责构建整个站点中使用的大量对象; 实际上,可以使用一系列超级IOC容器来解决从MVC站点的控制器到后端代码的数据服务和配置对象的任何问题.

XML构建了一堆动态方法,然后隐藏在工厂接口后面.加载和构建后,在App Domain回收之前,不会重建这些方法.

其中一个文件中的最小变化会对网站的功能产生深远影响,因此更新通常可以作为简单的配置更改进行部署.这些文件可以出现在网站根目录及其中的任何子文件夹中 - 但不会出现在任何标准的Asp.Net文件夹(App_LocalResources等)中.

但是因为文件不使用Asp.Net/IIS认为是"重要"的扩展名(假设扩展名为.configfoo),如果我更改其中一个,我必须手动确保服务器上的应用程序域重新启动:

a)触摸web.config以强制AppDomain重新启动; 要么

b)重新编译二进制文件

我想做的是以某种方式告诉Asp.Net/IIS将这些文件包含在其监视中,并将它们视为与.config文件和bin文件夹中的.dll 一样重要 ; 如果其中任何一个更改,则触发应用程序域重新启动.

更新以回应Artem的回答

我已经尝试将文件放在bin\或者中App_LocalResources,例如,实际上AppDomain重新启动 - 这是个好消息,但是......我不喜欢bin\部署,因为在开发过程中只需要轻松更新文件是做一个构建(除非你手动复制/粘贴),它也不符合这些文件作为内容的概念 - 这实际上是它们,并且需要从部署的角度来对待.

同样,App_LocalResources(等)解决方案很棒,但从开发人员的角度来看并不自然 - 它是一个配置文件,因此应该能够放在与其他配置文件相同的位置(这也是VS看起来很小的问题)如果由于其上下文相关的"添加新项目"对话框而添加到此文件夹,则不会看到我已完成的项目模板.

最后,它没有解决项目可能包含的其他自由格式文件夹的问题,这些文件夹可能包含.configfoo文件以及aspx/ascx/master/.config文件等.除非我强制将这些文件夹全部放在Asp.Net中.文件夹当然,但没有人希望在里面找到一个页面App_LocalResources!

结束更新

如果做不到这一点 - 我记得在几年前看过一些FileSystemWatcher使用了a的代码,它AppDomain.Unload根据自己的基于文件的规则触发了网站内部.我认为现在首选的方法是使用System.Web.Hosting.HostingEnvironment.InitiateShutdown.

这是我的最后一招,因为当我已经知道我想要的东西已经为其他一些扩展做了我时,我会犹豫不决.

那么是否可以向正在观看的人添加其他依赖文件?或者我将不得不自己动手?

任何建议,一如既往,非常感谢

.net asp.net iis

6
推荐指数
1
解决办法
954
查看次数

DisplayAttribute:对App_GlobalResources中的资源没有好处

这个问题确实适用于所有项目,但是我的演示环境是一个MVC3应用程序,因此该标记.

DisplayNameAttribute为MVC2项目编写了一个衍生类,就像很多人一样,所以我可以在MVC编辑器和显示模板中本地化显示名称.我解除了ValidationAttribute用于错误消息的本地化代码,使其以"标准"方式运行.

然后我注意到在MVC3中我们有了DisplayAttribute,所以我在我的MVC扩展框架的.Net 4版本中尽职尽责地废弃了我的属性类,并改变了当前项目中的模型属性以使用它,例如:

[Display(ResourceType = typeof(Resources.MyResources), Name = "ResourceName")]
public string ModelProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)

然后我运行Web应用程序,我收到类似这样的错误:

System.InvalidOperationException:无法检索属性"名称",因为本地化失败.类型"[此处的资源类型]"不是公共的,或者不包含名称为"[资源名称此处]"的公共静态字符串属性.

我当然在各个地方使用本地化,而在类库中,这些资源通常会被标记为公共.但是,在Web应用程序中,我将使用该App_GlobalResources文件夹,因为这就是它的用途!

这里的问题是,为此文件夹中的resx文件生成的资源访问器始终作为内部访问生成,无法更改它.

所以,因为DisplayAttribute似乎只是寻找公共成员(而我从ValidationAttribute我自己的DisplayNameAttribute衍生类型复制并应用的本地化代码只是寻找具有公共或内部可见性的静态成员),它似乎DisplayAttribute是对任何MVC的禁止打算App_GlobalResources用于本地化字符串的网络应用程序?

除了这可能是一个错误的事实DisplayAttribute,有没有其他人遇到这个问题?你做了什么来解决它?我是否应该尊重使用DisplayAttribute和更改我的所有资源,以便在类库项目中"正确"嵌入,并将它们全部设置为公共?或者我应该放弃DisplayAttribute以支持我认识的其他课程!?

.net asp.net asp.net-mvc localization

6
推荐指数
1
解决办法
6601
查看次数

默认参数和反射:如果ParameterInfo.IsOptional那么DefaultValue总是可靠的吗?

我正在研究如何ParameterInfo.IsOptional定义(我正在向内部IOC框架添加默认参数支持),在我看来,如果为true,则无法保证ParameterInfo.DefaultValue(或实际上ParameterInfo.RawDefaultValue)实际上是默认值适用.

如果你看一下给出IsOptionalMSDN示例,在IL中似乎可以定义一个可选的参数但是没有提供默认值(假设ParameterAttributes.HasDefault必须显式提供).即可能导致一种情况,一个参数的类型是,比如说Int32,ParameterInfo.IsOptional是真实的,但ParameterInfo.DefaultValue为空.

我的语言是C#,因此我可以什么工作,编译器就行了.基于此我可以进行如下简单测试(parameter这是一个ParameterInfo实例,该方法旨在返回一个实例,用作参数的运行时参数):

if(no_config_value)
{
  if(!parameter.IsOptional) throw new InvalidOperationException();
  //it's optional, so read the Default
  return parameter.DefaultValue;
}
else
  return current_method_for_getting_value();
Run Code Online (Sandbox Code Playgroud)

但我认为某些语言(我希望在IL级别上做到这一点,而不仅仅是基于一个特定的编译器所做的)可以将责任放在调用者上以确定要使用的默认值,如果所以,default(parameter.ParameterType)需要按顺序进行.

这是一个有趣的地方,因为DefaultValue显然DBNull.Value(根据文档RawValue),如果没有默认值.如果参数是类型object和,这是不好的IsOptional==true!

已经做了较为挖掘一下,我希望,可靠的方式来解决,这是物理读取ParameterInfo.Attributes成员,读bitflags单独第一,检查ParameterAttributes.Optional检查ParameterAttributes.Default.只有两者都存在,那么阅读才是ParameterInfo.DefaultValue正确的. …

.net compiler-construction reflection

6
推荐指数
1
解决办法
1946
查看次数

将已排序数组快速就地分区为两个已排序的子数组

编辑 - 我删除了所有不必要的上下文解释 - 太罗嗦,最终与问题无关.总而言之,我在构建平衡KD树的过程中对坐标数组进行了划分(请参阅维基百科文章,构造部分了解更多.我实际上有n个项目的k个并行数组,每个项目都必须通过相同的比较进行分区)

这不是家庭作业 - 我写的问题就是确保传达所有的细微差别.

给定排序数组:

 int[] ints =  { 0, 1, 2, 3, 4, 5, 6 };
 //this one is important - my current solution fails on this
 int[] ints2 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Run Code Online (Sandbox Code Playgroud)

请注意,由于同事要求澄清,所有关于这些阵列的保证element[n]都将小于或等于element[n+1].

在这些成功的操作将它们分离为两个子阵列LR(如下所示):

/*ints == */  { 1, 3, 5, 0, 2, 4, 6 }
              /*|> L <|  |>   R  <|*/

/*ints2 == */ …
Run Code Online (Sandbox Code Playgroud)

c# algorithm

6
推荐指数
1
解决办法
1766
查看次数

如果参数为null,则阻止执行MVC Action方法

我想过几种方法,但我想得到社区的看法.我有一种感觉,答案非常简单 - 我不害怕看起来很愚蠢(我的孩子很久以前就把这种恐惧从我身上带走了!)

我正在使用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请求格式错误.

c# asp.net-mvc .net-3.5 asp.net-mvc-2

5
推荐指数
1
解决办法
3013
查看次数