每个人都在说如何用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.
我正在尝试我的第一个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返回展开的属性值.
有没有办法指定给定的Controller或Action以只读方式使用Session状态?在"旧"ASP.NET中我们曾经做过类似的事情:
<%@ Page EnableSessionState="ReadOnly" %>
Run Code Online (Sandbox Code Playgroud)
是否有ASP.NET MVC等效?我希望允许我的应用程序同时处理来自同一客户端的多个请求,完全关闭会话在我的情况下不是一个选项.
我被告知的一切都说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) 给出以下两个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)
因此,功能类型有什么用?函数指针类型不包括案例,并且更方便吗?
我试图通过https访问公开托管的SOAP Web服务(而不是WCF),我收到的错误是我以前从未见过的.首先,这是事实:
现在,例外:
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协议的专家,我可能会错过关于发生了什么的线索.然而,在这里,我看到的是:
我的绑定设置如下:
<binding name="https_binding">
<textMessageEncoding />
<httpsTransport useDefaultWebProxy="false" />
</binding>
Run Code Online (Sandbox Code Playgroud)
我的行为设置如下:
<behavior …Run Code Online (Sandbox Code Playgroud) 我有几个项目生成我发布到内部服务器的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也坚持构建"默认分支".如果我将"默认分支"设置为不存在的东西,我会收到错误.
如果一个特定的构建不是一个标签,我已经考虑过尽早结束构建,但我不知道如何在没有失败构建的情况下做到这一点,这不是我想要的.
如何使一个或多个构建步骤仅运行新标记,而不是常规提交?
使用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 …
我正在尝试编写(在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之后的某个时候应用的).
我正在尝试在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) wcf ×3
.net ×2
nuget ×2
remoting ×2
32-bit ×1
32bit-64bit ×1
64-bit ×1
asp.net-mvc ×1
button ×1
c# ×1
c++ ×1
certificate ×1
cygwin ×1
function ×1
https ×1
msbuild ×1
msys ×1
performance ×1
session ×1
silverlight ×1
sockets ×1
ssl ×1
teamcity ×1
unix-socket ×1
wpf ×1