小编Mar*_*ark的帖子

.NET Remoting真的被弃用了吗?

每个人都在说如何用WCF取代.NET Remoting,但我想知道它是多么准确.我还没有看到任何关于Remoting被弃用的官方消息,在我看来,Remoting肯定比WCF更有意义.即使在框架的4.0版本中,也没有弃用与Remoting相关的对象或方法.我的理解是3.5和4.0框架中的System.AddIn使用Remoting.

有没有人有任何相反的官方消息?

在文章" 选择.NET中的通信选项(3.0版,因为那是该文章的最新版本)"中,它指出:

8跨应用程序域通信

如果需要在同一进程中支持不同应用程序域中的对象之间的通信,则必须使用.NET远程处理.

现在,这当然不准确,因为WCF当然可以用于跨越appdomain边界,但它是否正在为该场景提供官方建议?

更新:我发送了Clemens Vasters(谁是拥有Remoting和WCF的团队)这个问题:

Clemens,我知道你是拥有远程控制和wcf的团队,我有几个问题,我认为我需要去找源代码.

首先,我有一个关于远程处理是否会消失的问题.具体来说,我们有一个相当大的应用程序,它广泛使用远程处理进行跨域appdomain通信,我想知道远程处理的这种用法是否被认为是"遗留".如果是这样,AppDomain.CreateInstance和朋友会被其他东西取代吗?

这是他的回复:

远程处理是.Net框架的一部分,因此它不会消失.自Windows NT 3.5/Windows 95以来,COM一直在Windows中,并且还没有消失,我也不认为它会很快消失.

也就是说,Remoting的开发投资非常少.WCF是Remoting的继承者,并取代了托管代码的COM/DCOM.

对于进程内,跨域应用程序通信远程处理是CLR的本地通信方式.如果您发现在短时间内抽取大量数据或大量消息的性能问题,您应该认真考虑WCF和NetNamedPipeBinding.

.net wcf remoting

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

NuGet包失败,"无法找到"@(_ OutputPathItem - >'%(FullPath)..."

我正在尝试我的第一个NuGet包,而且我遇到了一些麻烦.我有一个相当简单的项目,以及一个非常简单的.nuspec文件:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>$id$</id>
    <version>$version$</version>
    <title>$title$</title>
    <authors>$author$</authors>
    <owners>$author$</owners>
    <description>$description$</description>
  </metadata>
</package>
Run Code Online (Sandbox Code Playgroud)

当我使用此命令行运行NuGet包时:

NuGet.exe pack mylibrary.csproj -Verbosity detailed -Properties Configuration=Debug
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

NuGet.CommandLineException: Unable to find '@(_OutputPathItem->'%(FullPath)mylibrary.dll')'. Make sure the project has been built.
   at NuGet.Commands.ProjectFactory.BuildProject()
   at NuGet.Commands.ProjectFactory.CreateBuilder(String basePath)
   at NuGet.Commands.PackCommand.BuildFromProjectFile(String path)
   at NuGet.Commands.PackCommand.BuildPackage(String path)
   at NuGet.Commands.PackCommand.ExecuteCommand()
   at NuGet.Commands.Command.Execute()
   at NuGet.Program.Main(String[] args)
Run Code Online (Sandbox Code Playgroud)

输出文件肯定在bin\Debug文件夹中,但NuGet显然没有找到它们.

这显然只有在.csproj文件的ToolsVersion设置为3.5或更低时才会发生.将ToolsVersion设置为4.0可以解决问题.

似乎MSBuild 3.5在调用_project.GetPropertyValue("TargetPath")(ProjectFactory.cs~296)时返回未展开的属性值,其中MSBuild 4.0返回展开的属性值.

nuget

25
推荐指数
2
解决办法
9299
查看次数

在ASP.NET MVC中指定只读会话

有没有办法指定给定的Controller或Action以只读方式使用Session状态?在"旧"ASP.NET中我们曾经做过类似的事情:

<%@ Page EnableSessionState="ReadOnly" %>
Run Code Online (Sandbox Code Playgroud)

是否有ASP.NET MVC等效?我希望允许我的应用程序同时处理来自同一客户端的多个请求,完全关闭会话在我的情况下不是一个选项.

asp.net-mvc session

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

为什么我从WCF看到的性能比Remoting慢?

我被告知的一切都说WCF应该至少和远程处理一样快.我有一个特定的场景,然而,它甚至没有接近,我想知道是否有人可以发现一些明显的我做错了.我正在研究用wcf替换远程处理以进行进程内appdomain通信繁重的可能性.这是代码:

[ServiceContract]
interface IWorkerObject
{
    [OperationContract] Outcome DoWork(Input t);
}

[DataContract]
[Serializable]
class Input
{
    [DataMember] public int TaskId { get; set; }
    [DataMember] public int ParentTaskId { get; set; }
    [DataMember] public DateTime DateCreated { get; set; }
    [DataMember] public string TextData { get; set; }
    [DataMember] public byte[] BinaryData { get; set; }
}

[DataContract]
[Serializable]
class Outcome
{
    [DataMember] public string Result { get; set; }
    [DataMember] public string TextData { get; set; }
    [DataMember] public byte[] …
Run Code Online (Sandbox Code Playgroud)

.net performance wcf remoting

14
推荐指数
1
解决办法
3767
查看次数

什么是用于的函数类型?

给出以下两个typedefs:

typedef void (*pftype)(int);

typedef void ftype(int);
Run Code Online (Sandbox Code Playgroud)

我理解第一个定义pftype为一个函数的指针,它接受一个int参数并且什么都不返回,第二个定义ftype为一个函数类型,它接受一个int参数并且什么都不返回.但是,我不了解第二个可能用于什么.

我可以创建一个匹配这些类型的函数:

void thefunc(int arg)
{
    cout << "called with " << arg << endl;
}
Run Code Online (Sandbox Code Playgroud)

然后我可以使用每个创建指向此函数的指针:

int main(int argc, char* argv[])
{
    pftype pointer_one = thefunc;
    ftype *pointer_two = thefunc;

    pointer_one(1);
    pointer_two(2);
}
Run Code Online (Sandbox Code Playgroud)

使用函数类型时,我必须指定我正在创建一个指针.使用函数指针类型,我没有.两者都可以互换使用作为参数类型:

void run_a_thing_1(ftype pf)
{
    pf(11);
}

void run_a_thing_2(pftype pf)
{
    pf(12);
}
Run Code Online (Sandbox Code Playgroud)

因此,功能类型有什么用?函数指针类型不包括案例,并且更方便吗?

c++ function-pointers function

14
推荐指数
1
解决办法
677
查看次数

如何强制WCF客户端发送客户端证书?

我试图通过https访问公开托管的SOAP Web服务(而不是WCF),我收到的错误是我以前从未见过的.首先,这是事实:

  • 此服务需要客户端证书.我有一个证书,该证书由与服务器证书相同的CA签名.
  • 我知道URL可用,因为我可以在Internet Explorer中找到它.IE打开"选择证书"窗口,如果我选择它(并忽略server-host-name-does-not-match-certificate错误),它会继续并给我一个HTTP 500错误.
  • 如果我在Chrome中打开网站,在选择证书并忽略错误后,我会收到有关WSA Action = null的正常错误消息.
  • 如果我在FireFox中打开网站,忽略错误后,我会得到一个页面,说明服务器无法验证我的证书.它从未要求我选择一个,所以这是完全合理的.

现在,例外:

Error occurred while executing test 12302: System.ServiceModel.Security.SecurityNegotiationException: Could not establish secure channel for SSL/TLS with authority 'ihexds.nist.gov:9085'. ---> System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
   at System.Net.HttpWebRequest.GetResponse()
   at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
Run Code Online (Sandbox Code Playgroud)

我跟踪了与WireShark的交互,但由于我不是TLS协议的专家,我可能会错过关于发生了什么的线索.然而,在这里,我看到的是:

  1. C - > S客户端你好
    • 包含随机数,日期/时间,支持的密码套件等内容
  2. S - > C服务器Hello,证书,证书请求,服务器Hello完成
    • 包含服务器的证书和客户端证书的请求
  3. C - > S证书,客户密钥交换,更改密码规范,加密握手消息
    • 这是有趣的部分 - 这个数据包的第一部分是证书握手,我假设客户端证书是,但没有证书(证书长度:0).
  4. S - > C警报(级别:致命,描述:错误证书)
    • 嗯,是的,没有发送证书.

我的绑定设置如下:

<binding name="https_binding">
    <textMessageEncoding />
    <httpsTransport useDefaultWebProxy="false" />
</binding>
Run Code Online (Sandbox Code Playgroud)

我的行为设置如下:

<behavior …
Run Code Online (Sandbox Code Playgroud)

ssl https wcf certificate

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

如何仅为标签运行TeamCity构建?

我有几个项目生成我发布到内部服务器的NuGet包.我们正在使用语义版本控制,并在我们的Git存储库中使用标签来控制版本号.

我正在这样标记:

git tag -a v1.0.0 -m "tagged"
Run Code Online (Sandbox Code Playgroud)

而且,在TeamCity构建期间,我运行git describe --long,产生如下输出:

v1.0.0-0-ge9c047d
Run Code Online (Sandbox Code Playgroud)

输出中的第四个数字是标记之后的提交数.这0意味着自标签以来没有提交任何提交.我使用前四个数字作为版本号(顺便提一下,整个字符串作为AssemblyInformationalVersion).

我有TeamCity包并发布了一个NuGet包,但这里有粘性.我只想发布标签,从不在标签之后提交(因为在这种情况下版本号可能是错误的,可能非常错误).

我已经尝试将VCS根目录中的"分支规范"设置为"+:refs/tags/*",这会导致构建所有标记,但TeamCity也坚持构建"默认分支".如果我将"默认分支"设置为不存在的东西,我会收到错误.

如果一个特定的构建不是一个标签,我已经考虑过尽早结束构建,但我不知道如何在没有失败构建的情况下做到这一点,这不是我想要的.

如何使一个或多个构建步骤仅运行新标记,而不是常规提交?

teamcity build-process nuget

13
推荐指数
1
解决办法
4767
查看次数

在按钮的控件模板中,如何设置包含文本的颜色?

使用Silverlight 4和WPF 4,我正在尝试创建一个按钮样式,当按钮被鼠标悬停时,它会改变任何包含文本的文本颜色.因为我试图使它与Silverlight和WPF兼容,所以我使用了可视状态管理器:

<Style TargetType="{x:Type Button}">
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="Button">
            <Border x:Name="outerBorder" CornerRadius="4" BorderThickness="1" BorderBrush="#FF757679">
                <VisualStateManager.VisualStateGroups>
                    <VisualStateGroup x:Name="CommonStates">
                        <VisualState x:Name="Normal" />
                        <VisualState x:Name="MouseOver">
                            <Storyboard>
                                <ColorAnimation Duration="0" To="#FFFEFEFE"
                                                Storyboard.TargetProperty="(TextElement.Foreground).(SolidColorBrush.Color)"
                                                Storyboard.TargetName="contentPresenter"/> 
                            </Storyboard>
                        </VisualState>
                    </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
                <Grid>
                    <Border x:Name="Background" CornerRadius="3" BorderThickness="1" BorderBrush="Transparent">
                        <Grid>
                            <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}"/>
                        </Grid>
                    </Border>
                </Grid>
            </Border>
        </ControlTemplate>
    </Setter.Value>
</Setter>
Run Code Online (Sandbox Code Playgroud)

由于这是一个常规旧按钮的模板,我知道不能保证里面甚至有一个文本块,起初我不确定这是否可能.奇怪的是,如果按钮声明如下,文本颜色确实会改变:

<Button Content="Hello, World!" />
Run Code Online (Sandbox Code Playgroud)

但如果按钮声明如下,它不会改变:

<Button>
    <TextBlock Text="Hello, World!" /> <!-- Same result with <TextBlock>Hello, World </TextBlock> -->
</Button>
Run Code Online (Sandbox Code Playgroud)

即使可视树(在snoop中检查时)是相同的(Button - > ContentPresenter …

silverlight wpf button visualstatemanager controltemplate

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

MSYS/Cygwin使用什么机制来模拟Unix域套接字?

我正在尝试编写(在C#中)一个软件,该软件与使用MSYS构建的另一个软件(MSYS仿真的)Unix域套接字进行通信.我已经了解到"套接字服务器"(我不清楚正确的术语是什么)会创建一个包含以下内容的临时文件:

!<socket >59108 282F93E1-9E2D051A-46B57EFC-64A1852F
Run Code Online (Sandbox Code Playgroud)

59108对应于TCP端口,"套接字服务器"正在环回接口上侦听.使用数据包捕获工具,我已经能够确定"套接字客户端"连接到此端口,并通过环回接口交换信息.

我在我的软件中复制了这种行为,"套接字客户端"连接到我的监听端口,但没有传输任何信息.我相信这里有另一个步骤,一个很可能涉及"套接字"文件中的GUID,但我一直无法确定它是什么.如何触发客户端的通信需要做什么?

似乎MSYS正在使用Cygwin的机制,它涉及一个命名事件,即(可能是?)由"服务器"创建,并由"服务器"发出信号(显然),但我对实现的天真尝试似乎并不工作.

我找到了一封由康拉德·斯科特写的电子邮件,该电子邮件描述了"握手"过程中的各种缺点,并提出了据称解决这些问题的补丁.在这封电子邮件中,Conrad稍微描述了所使用的过程,他指出实际上有两个事件,一个由"服务器"管理,另一个由"客户端"管理.我已经使用API Monitor来查找对CreateEvent()的调用,虽然有几个,但我找不到一个看似"吸烟枪"的东西.对CreateSemaphore()也没有任何有趣的调用,所以似乎从未应用过Conrad的补丁(或者,至少,它是在MSYS分叉Cygwin之后的某个时候应用的).

c# sockets cygwin msys unix-socket

10
推荐指数
3
解决办法
1445
查看次数

为什么64位MSBuild加载32位扩展?

我正在尝试在64位计算机上使用MSBuild(v4.0)构建项目.出于某种原因,MSBuild正在尝试加载32位扩展,我无法弄清楚原因.为了证明这个问题,我已经将问题缩小到最小的集合.

使用以下MSBuild项目文件:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
    <Target Name="test">
        <Message Text="bin path: $(MSBuildBinPath)" />
        <Message Text="extensions path: $(MSBuildExtensionsPath)" />
        <Message Text="extensions path (x86): $(MSBuildExtensionsPath32)" />
        <Message Text="extensions path (x64): $(MSBuildExtensionsPath64)" />
    </Target>
</Project>
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

Microsoft (R) Build Engine Version 4.0.30319.1
[Microsoft .NET Framework, Version 4.0.30319.1]
Copyright (C) Microsoft Corporation 2007. All rights reserved.

Build started 8/27/2010 9:56:35 AM.
Project "D:\5\test.proj" on node 1 (default targets).
test:
  bin path: C:\Windows\Microsoft.NET\Framework64\v4.0.30319
  extensions path: C:\Program Files (x86)\MSBuild
  extensions path (x86): C:\Program Files (x86)\MSBuild
  extensions path …
Run Code Online (Sandbox Code Playgroud)

msbuild 64-bit 32-bit 32bit-64bit

9
推荐指数
1
解决办法
3224
查看次数