[英]WCF With NetTCP across machines on the same network
我正在尝试在同一网络上的多台计算机和一台服务器之间实现一些跨进程通信。 我现在正在尝试的是使用WCF和NetTcpBinding,我的应用程序托管在同一台机器上,但是当我尝试从另一台机器连接时,它会抛出SSPI安全错误。
我发现了很多这样的跨机器的例子,但都涉及到app.config文件,我真的很想避免。 我希望能够将此功能嵌入到没有其他依赖项(即配置文件)的DLL中,我可以将其传递给所有必需的服务器地址等,它将起作用。 无论如何,仅仅在代码中设置此安全性(通过端点等)?
我正在用以下代码测试这一切:
服务器:
using System;
using System.ServiceModel;
namespace WCFServer
{
[ServiceContract]
public interface IStringReverser
{
[OperationContract]
string ReverseString(string value);
}
public class StringReverser : IStringReverser
{
public string ReverseString(string value)
{
char[] retVal = value.ToCharArray();
int idx = 0;
for (int i = value.Length - 1; i >= 0; i--)
retVal[idx++] = value[i];
string result = new string(retVal);
Console.WriteLine(value + " -> " + result);
return result;
}
}
class Program
{
static void Main(string[] args)
{
var uri = "net.tcp://" + System.Net.Dns.GetHostName() + ":9985";
Console.WriteLine("Opening connection on: " + uri);
using (ServiceHost host = new ServiceHost(
typeof(StringReverser),
new Uri[]{
new Uri("net.tcp://" + System.Net.Dns.GetHostName() + ":9985")
}))
{
host.AddServiceEndpoint(typeof(IStringReverser),
new NetTcpBinding(),
"TcpReverse");
host.Open();
Console.WriteLine("Service is available. " +
"Press <ENTER> to exit.");
Console.ReadLine();
host.Close();
}
}
}
}
客户:
using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
namespace WCFClient
{
[ServiceContract]
public interface IStringReverser
{
[OperationContract]
string ReverseString(string value);
}
class Program
{
static void Main(string[] args)
{
var ep = "net.tcp://SERVER:9985/TcpReverse";
ChannelFactory<IStringReverser> pipeFactory =
new ChannelFactory<IStringReverser>(
new NetTcpBinding(),
new EndpointAddress(
ep));
IStringReverser pipeProxy =
pipeFactory.CreateChannel();
Console.WriteLine("Connected to: " + ep);
while (true)
{
string str = Console.ReadLine();
Console.WriteLine("pipe: " +
pipeProxy.ReverseString(str));
}
}
}
}
通常在绑定上配置安全性。 您正在使用NetTcpBinding
及其默认值,这意味着启用了Transport
安全性。
在服务器和客户端上,您应该将NetTcpBinding
实例分配给本地变量,以便您可以更改安全性(可能还有其他)设置,然后在调用AddServiceEndpoint
或创建ChannelFactory
时使用该变量。
样品:
var binding = new NetTcpBinding();
// disable security:
binding.Security.Mode = SecurityMode.None;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.