小编Eth*_*own的帖子

ServiceRoute + WebServiceHostFactory杀死WSDL生成?如何使用?wsdl创建无扩展的WCF服务

我正在尝试使用无扩展/ .svc-less WCF服务.任何人都可以确认或否认我遇到的问题吗?

我在代码中使用路由,并在global.asax.cs的Application_Start中执行此操作:

RouteTable.Routes.Add(new ServiceRoute("Data", new WebServiceHostFactory(), typeof(DataDips)));
Run Code Online (Sandbox Code Playgroud)

我已经在IIS 6和IIS 7.5中进行了测试,我可以很好地使用该服务(即我的无扩展通配符映射处理程序配置正确指向ASP.NET).但是,元数据生成完全搞砸了.我可以使用WCF测试客户端(我假设svcutil.exe)命中我的/ mex端点 - 但是你通常使用.svc生成的?wsdl是toast.我无法用浏览器命中它(获得400个错误请求),我无法使用wsdl.exe等命中它.在web.config中正确配置了元数据生成.

这当然是一个问题,因为该服务作为basicHttpBinding公开,因此旧式ASMX客户端可以访问它.但是,当然,如果没有WSDL描述,客户端就无法生成代理.

如果我改为在这样的配置中使用serviceActivation路由,而不是在代码中注册路由:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
  <serviceActivations>
    <add relativeAddress="Data.svc" service="DataDips" />
  </serviceActivations>
</serviceHostingEnvironment>
Run Code Online (Sandbox Code Playgroud)

那么瞧...它有效.

但后来我没有一个干净的无扩展网址.如果我将relativeAddress从Data.svc更​​改为Data,那么我会得到一个配置异常,因为config不支持.(必须使用注册到WCF的扩展).

我也尝试将此代码与上面的配置结合使用:

RouteTable.Routes.MapPageRoute("","Data/{*data}","~/Data.svc/{*data}",false);
Run Code Online (Sandbox Code Playgroud)

我的想法是,我可以将无扩展名的URL指向配置的.svc网址.这不起作用 - /data.svc继续工作,但/ Data返回404.

如果在这样的配置中使用urlMappings,并且与上面的serviceActivation结合使用,我确实找到了解决办法:

<urlMappings>
   <add url="~/Data" mappedUrl="Data.svc"/>
</urlMappings>
Run Code Online (Sandbox Code Playgroud)

这个问题有两个方面 - 1.看起来很复杂2.在生成的WSDL中,操作端点仍然引用Data.svc /而不是Data/ - 因此依赖于Data.svc实际存在/响应.

这不是我想要的,即使它有点/有点解决问题.

是否有正确的方法来获得无扩展的WCF服务URL以正确生成WSDL?

.net iis service wcf

21
推荐指数
1
解决办法
1万
查看次数

Powershell $ Error对象不会立即填充PSM1模块内部

我遇到了Powershell的一个特殊问题.我在catch块中捕获了一个Exception,但是没有填充全局$ Error对象.

一个简单的例子,其表现如预期的那样:

function Bar
{
  Foo
}

function Foo
{
  try
  {
    $Error.Clear()
    throw "Error!"
  }
  catch
  {
    "Caught an error - current error count $($Error.Count)"  
  } 
  finally
  {
    "Cleaning up - current error count $($Error.Count)"  
  }
}
Run Code Online (Sandbox Code Playgroud)

如果你打电话给Bar,输出就像你期望的那样

Caught an error - current error count 1
Cleaning up - current error count 1
Run Code Online (Sandbox Code Playgroud)

我遇到问题的代码几乎完全相同,只是它从模块加载Foo.不确定这是一个bug,还是我不理解的东西(必须检查我的Powershell in Action书!)

如果我将Foo保存到模块--Foo.psm1

function Foo
{
  try
  {
    $Error.Clear()
    throw "Error!"
  }
  catch
  {
    "Caught an error - current error count $($Error.Count)"  
  } 
  finally …
Run Code Online (Sandbox Code Playgroud)

powershell exception-handling

8
推荐指数
2
解决办法
4108
查看次数

IE8没有适当地跨域应用cookie - 仅在一台机器上

我有任何有趣的问题,让我完全难过.

我有一段我构建的生产代码,它读取由另一个部门管理的机器设置的IBM LTPA令牌cookie,对其进行验证,并使用它来登录我的团队管理的系统(通过设置一些特殊的cookie).这个单点登录过程对最终用户完全透明,并且在所有浏览器中已经在生产中运行了好几年.

最近,我注意到它在我的IE8开发机器上无法正常工作.我最近从Vista升级到Windows 7.但是我不确定在升级之前或之后这是不是在我的机器上工作,因为它已经工作了很长时间,我没有理由对它进行测试.同一台机器上的FireFox 3.5和Chrome 4 dev都按预期工作.在这台机器上的XP SP3虚拟IE6工作正常.家中多台机器上的IE8工作正常(Windows Server 2008和Windows 7).

出于诊断目的,我清除了我的开发IE8(WinInet缓存)中的所有缓存数据,以一个干净的平板开始.我向Fiddler开火,追查过程并确定哪些不起作用.我发现的相当有趣,我无法解释.

在初始站点登录后 - 让我们将其命名为ltpa.domain.com,会话cookie将按预期使用Set-Cookie标头从服务器下推.我验证域已正确设置为.domain.com并且路径为/.登录后来自浏览器的所有后续请求将所有cookie按预期推送回服务器并返回每个请求.事实上,这是一个门户网站,还有一些额外的内容,也就是说,portal.domain.com也可以检索; 所有cookie也正确传递给该服务器.

现在有趣的是 - 当我向myserver.domain.com发出请求时 - 由ltpa.domain.com设置的域级别cookie不会被推送到myserver.domain.com,即使它们应该是. 如果缺少cookie,则单点登录进程会自动重定向回ltpa.domain.com(并将cookie推送到ltpa登录进程用于重定向的客户端) - myserver设置的域级别cookie未被推送回到ltpa.domain.com.

同样,这只发生在我所知道的我的开发机器上的这个IE8实例上.这个过程每天使用数千次,用户群相当大,我们没有收到最终用户的其他投诉 - 因此没有迹象表明这是IE8或类似的系统性问题.

在我看来,它将myserver.domain.com和ltpa.domain.com视为单独的域,即使它们不是.

有两点可能值得一提 - 但可能是红色鲱鱼,因为它一直都是这样,并且从未引起过任何问题.

  • DNS在这里有点时髦.LTPA.domain.com解析为外部IP.但是,myserver.domain.com解析为内部IP.对该IP进行反向查找会给出内部dns名称 - 比方说myserver.internal.domain.com.我推测可能IE8正在进行某种反向查找以防止基于DNS的攻击 - 因此我修改了我的HOSTS文件并将myserver.domain.com指向外部IP以进行测试.我在Fiddler中证实了请求转到了外部IP - 但它与cookie没有任何区别.他们仍然没有通过.

  • 以前,myserver.domain.com位于IE WinInet安全配置页面中的"可信站点"下.我删除了它和那里的另一个网站.我们叫这台机器,my2.domain.com; 巧合地(或许不是?)这台机器也没有通过ltpa.domain.com设置的域cookie.在这种情况下,我不需要传递cookie,但我还是测试了它,看看这个问题是否影响了其他机器.在IE状态栏中,ltpa.domain.com,portal.domain.com和myserver.domain.com都显示在"Internet"区域下.有点奇怪的是,my2.domain.com仍然在状态栏中显示"可信站点",即使它没有在对话框中列出?是的,我在进行更改后重新启动.

其他注意事项.

  • 我知道IE和非.com域的其他问题,引用的cookie值和其他cookie异常 - 在stackoverflow和Interwebs上的其他地方提到过.这些都不适用.我已经阅读了Eric Law的关于cookie内部的IEInternals文章 - http://blogs.msdn.com/ieinternals/archive/2009/08/20/WinINET-IE-Cookie-Internals-FAQ.aspx

  • 在IE中没有启用时髦的插件.Just Flash,Silverlight,Live ID登录助手和Fiddler2.

  • 没有用于过滤特定于我的域的内容的InPrivate规则.

  • 由于我在笔记本电脑上,我从家庭网络(重启后)尝试过IE8以排除DNS问题.我在家里遇到了同样的行为,所以就我所知,时髦的DNS并不是问题.

  • 我已多次浏览所有IE设置,认为我可能错过了一个模糊的cookie设置.隐私设置为"中等",没有特殊处理的网站.

  • 使用开发工具,我确保未选中"始终从服务器刷新".

  • 我不认为这是我可以向微软报告的任何内容,因为我无法在其他任何地方重现这个问题.

所以在这一点上,我很茫然.没有在IE8中打开我不知道的某种诊断模式,或者没有用于调试的代码......我已经没有好主意了.

我想我已经遇到过一个bug,一些注册表设置或类似的东西已被调整,或某些东西,某处已经腐败.

有任何想法吗?

cookies internet-explorer setcookie internet-explorer-8

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

Mercurial子存储库 - 管理更复杂的依赖关系层次结构

我有一个使用相当标准的源树方法+ mercurial子存储库的主项目.

Master
\lib - compiled binaries - things like log4net, AutoFac, etc
\source - VS solution, one folder per project, etc
\tools - stuff used during the build process

\source\contrib - contains any subrepos like so:

\source\contrib\Sub1
\source\contrib\Sub2

Master\.hgsub contains something like
source\contrib\Sub1 = https://myserver.com/Sub1
Run Code Online (Sandbox Code Playgroud)

现在,最近确定Sub2需要来自Sub1的一些代码,因此我必须调整这个新的依赖结构.

问题当然是如果我按照与上面相同的方法并将Sub1作为Sub2的子目录添加,我最终会遇到这种丑陋的情况.

\source\contrib\Sub2\source\contrib\Sub1
Run Code Online (Sandbox Code Playgroud)

Master现在有2个独立的Sub1副本!

所以我知道在引用subrepos(=的RHS)时我应该使用相对路径 - 但是这在我理解的情况下对我的场景没有帮助.我认为没有办法让LHS 在Master存储库之外生存,我认为这是我真正需要的.

关于如何解决这个问题,我有几个想法,但没有一个与我坐在一起,我认为必须有更好的方法.我理想的解决方案允许我在多个项目中共享相同的子仓库,而不会支付多个副本的罚款.在我的场景中,这似乎是浪费和低效的(另外,我希望所有依赖于Sub1的项目使用相同的hg修订版,而不是单独修改)

  1. 删除Sub1作为Master的子库,并更改Master解决方案中的任何相对路径以引用双重嵌套的Sub1.这个路径结构不仅可怕,而且如果将Sub3添加到具有Sub1依赖性的master,我仍然有2个Sub1副本.

  2. 编译Sub1的副本,然后将其放入\ lib目录中.Sub1仍在进行一些流失,我宁愿建立源版本.我不想在新的二进制文件中不断地复制到源树的税(并且在树上膨胀).

  3. 以某种方式打破了Sub2对Sub1的依赖性.基于存储库的体系结构,这可能不会发生.Sub1包含一些非常通用的共享库代码.Sub2包含两个非常独立的项目中需要的WCF服务契约/接口/类型 - 客户端SDK和服务器实现.此时,将这些存储库分开是有意义的.

也许我正在考虑这个错误...或者我可能没有意识到某些技巧.

任何帮助表示赞赏.

mercurial subrepos

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

C# - 返回枚举?来自静态扩展方法

我为字符串添加了一些扩展方法,以便更轻松地处理一些自定义枚举.

public static Enum ToEnum<T>(this string s)
{
    return (Enum)Enum.Parse(typeof(T), s);
}

public static bool IsEnum<T>(this string s)
{
    return Enum.IsDefined(typeof(T), s);
}
Run Code Online (Sandbox Code Playgroud)

注意 - 由于泛型类型约束的限制,我必须编写如上所述的方法.我很乐意使用T ToEnum(这个字符串s),其中T:Enum在拨打电话后避免演员......但是没有办法.

无论如何,我认为将这个概念扩展到返回Enum会很好吗?在方法签名可以接受各种可以为空的枚举的情况下.

public static Enum? ToEnumSafe<T>(this string s)
{
    return (IsEnum<T>(s) ? (Enum)Enum.Parse(typeof(T), s) : null);
}
Run Code Online (Sandbox Code Playgroud)

但是,由于编译器错误,这是不可行的.

error CS0453: The type 'System.Enum' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'System.Nullable<T>'
Run Code Online (Sandbox Code Playgroud)

我不得不承认我在这里有点困惑作为Enum?应该是合法的返回值,不是吗?我尝试了类似的东西,但最终得到了同样的错误.

public static T? ToEnumSafe<T>(this string s)
{
    return (IsEnum<T>(s) …
Run Code Online (Sandbox Code Playgroud)

c# generics extension-methods enums

3
推荐指数
1
解决办法
1万
查看次数