我有一个WCF服务,它作为Windows服务托管.我们想在同一地址启用一个mex端点(但后缀为'/ mex').我一直在尝试使用以下配置执行此操作(失败):
<system.serviceModel>
<services>
<service
name="MyCompany.MyService"
behaviorConfiguration="defaultServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost"/>
</baseAddresses>
</host>
<endpoint
address="MyService"
binding="netTcpBinding"
contract="MyCompany.IMyService"
bindingConfiguration="netTcpBindingConfig"
/>
<endpoint
address="MyService/mex"
binding="mexTcpBinding"
contract="IMetadataExchange"
/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="defaultServiceBehavior">
<serviceMetadata />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<netTcpBinding>
<binding name="netTcpBindingConfig" portSharingEnabled="true" />
</netTcpBinding>
</bindings>
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)
当它运行时,服务主机抛出一个AddressAlreadyInUseException抱怨"IP端点上已经有一个监听器0.0.0.0:808".这实际上对我有意义,因为端口共享服务已打开该端口,以便为MyService请求在此计算机上共享该端口的任何其他服务提供端点服务.
所以似乎mex端点想要对端口808进行exlusive访问.我可以通过调整mex端点来解决这个问题:
<endpoint
address="net.tcp://localhost:818/MyService/mex"
binding="mexTcpBinding"
contract="IMetadataExchange"
/>
Run Code Online (Sandbox Code Playgroud)
这意味着mex端点现在拥有自己的专用端口.这方面的缺点是,任何其他想要公开mex端点的服务也需要一个唯一的端口用于其mex端点.这使得在查找mex端点时非常难以预测.
有没有办法强制mex端点参与端口共享?
是否有可能在PowerShell中测试脚本范围变量的存在?
我一直在使用PowerShell社区扩展(PSCX),但我注意到如果在Set-PSDebug -Strict设置时导入模块,则会产生错误:
The variable '$SCRIPT:helpCache' cannot be retrieved because it has not been set.
At C:\Users\...\Modules\Pscx\Modules\GetHelp\Pscx.GetHelp.psm1:5 char:24
Run Code Online (Sandbox Code Playgroud)
在研究如何解决这个问题时,我在Pscx.GetHelp.psm1中找到了这段代码:
#requires -version 2.0
param([string[]]$PreCacheList)
if ((!$SCRIPT:helpCache) -or $RefreshCache) {
$SCRIPT:helpCache = @{}
}
Run Code Online (Sandbox Code Playgroud)
这是非常简单的代码; 如果缓存不存在或需要刷新,请创建一个新的空缓存.问题是调用$SCRIPT:helpCachewhile Set-PSDebug -Strict有效会导致错误,因为尚未定义变量.
理想情况下,我们可以使用Test-Variablecmdlet,但这样的东西不存在!我考虑过查看variable:提供程序,但我不知道如何确定变量的范围.
所以我的问题是:如何Set-PSDebug -Strict在有效的情况下测试变量的存在,而不会导致错误?
我最近读到.NET 4的System.String类有一个新的Join方法重载.这个新的重载采用了一个分隔符,IEnumerable<T>它允许将任意集合连接成一个字符串,而无需转换为中间字符串数组.
凉!这意味着我现在可以这样做:
var evenNums = Enumerable.Range(1, 100)
.Where(i => i%2 == 0);
var list = string.Join(",",evenNums);
Run Code Online (Sandbox Code Playgroud)
......而不是这个:
var evenNums = Enumerable.Range(1, 100)
.Where(i => i%2 == 0)
.Select(i => i.ToString())
.ToArray();
var list = string.Join(",", evenNums);
Run Code Online (Sandbox Code Playgroud)
...因此节省了将每个项目转换为字符串,然后分配数组.
但是,作为一般编程功能样式的粉丝,特别是C#中的方法链接,我宁愿能够写出这样的东西:
var list = Enumerable.Range(1, 100)
.Where(i => i%2 == 0)
.string.Join(",");
Run Code Online (Sandbox Code Playgroud)
这不是合法的C#.是的,我可以这样做Enumerable.Aggregate,是的,我可以使用我自己的Join扩展方法来实现它,但是这些方法难以阅读/效率低下并感觉像是一个警察(分别),所以我想尝试做它是一种不同的方式.我到目前为止最接近的是这样的:
var list = Enumerable.Range(1, 100)
.Where(i => i%2 == 0)
.ApplyTo(
Functional.Curry<string, IEnumerable<object>, string>
(string.Join)(",")
);
Run Code Online (Sandbox Code Playgroud)
...使用以下扩展方法:
public …Run Code Online (Sandbox Code Playgroud) 我是Windows平台上经验丰富的开发人员,我正在尝试自学如何使用Vim.我对正则表达式非常了解并理解如何使用Vim的原理.但是,我有一个特定的问题,虽然我有一个解决方案,但感觉好像应该有一个更好的解决方案.
我有一个文件,其中包含类似于以下内容的行:
CODE<tab><tab>Lorem ipsum dolor sit amet
Run Code Online (Sandbox Code Playgroud)
在和之间可能有可变数量的<tab>或<space>字符.假设光标在正常模式下超过'C' ,我想要做的是找到一个组合键,它将产生以下输出,并将光标留在'E' 和'L'之间.在插入模式下.CODELoremCODECODELorem
CODELorem ipsum dolor sit amet
Run Code Online (Sandbox Code Playgroud)
我的解决方案是使用以下密钥序列:
w d ? \ s \ + <return>
这样可行,但在删除它之前,通过我要删除的东西感觉不合逻辑.我觉得我应该移到最后CODE并删除前进.我意识到这可能只是一个我不知道的Vim成语.我也完全错过了一个关键的Vim知识.
实现目标的最佳方法是什么?
我在C#中有以下代码:
DateTime dt = GetDateTime();
string formatted = dt.ToString("yyyyMMddTHHmmsszz");
Run Code Online (Sandbox Code Playgroud)
以下列格式返回日期:
20100806T112917+01
Run Code Online (Sandbox Code Playgroud)
我希望能够在VBScript中获得相同的结果(对于传统的ASP应用程序).我获取UTC偏移信息或将时间转换为UTC尤为重要.
我怎么做?
如何在不使用?的情况下检索本地计算机上所有私有MSMQ队列的名称System.Messaging.MessageQueue.GetPrivateQueuesByMachine(".")?我正在使用PowerShell,因此任何使用COM,WMI或.NET的解决方案都是可以接受的,尽管后者更可取.
请注意,此问题有一个返回所有队列对象的解决方案.我不想要这些对象(当有很多队列时它太慢而且有点松散),我只想要他们的名字.