我在c#中创建了一个WCF服务。我可以通过网址http://localhost:8080/classname/function
有没有办法检测客户端是否从WCF服务连接,其中客户端单独使用url http://localhost:8080
而没有类名和函数名称,其中WCF服务正在localhost处监听8080端口?
答案 0 :(得分:1)
根据您解释如何向WCF服务发送空字符串消息的请求,我已经开发了VS2017解决方案并上传到GITHUB。
该解决方案包含3个项目,2个位于WCF服务端(类库和控制台应用程序),1个用于客户端。
WCF服务端
首先我们定义一个ServiceContract
,它将有一个OperationalContract
来接收字符串消息并返回一个布尔值:
[ServiceContract]
public interface IClientConnectionService
{
[OperationContract]
bool Connect(string message);
}
接下来,我们有一个实现此ServiceContract
public class ClientConnectionService : IClientConnectionService
{
public bool Connect(string message)
{
/*
* As per your comment on http://stackoverflow.com/questions/43366101/how-to-check-wcf-service-is-connected-with-client?noredirect=1#comment74005120_43366101
* the message should be empty, however you can pass string.
* Once you are done with processing you can return true or false depending upon how you want to carry out
* this operation.
*/
return true;
}
}
接下来,我们有WCF服务主机管理器(基于控制台的应用程序只是为了托管这个WCF服务)
class Program
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(ClientConnectionService)))
{
host.Open();
Console.WriteLine($"{host.Description.Name} is up and listening on the URI given below. Press <enter> to exit.");
PrintServiceInfo(host.Description);
Console.ReadLine();
}
}
private static void PrintServiceInfo(ServiceDescription desc)
{
foreach (ServiceEndpoint nextEndpoint in desc.Endpoints)
{
Console.WriteLine(nextEndpoint.Address);
}
}
}
它的职责是保持WCF服务监听在配置文件中定义的net.tcp端口上的请求:
<system.serviceModel>
<services>
<service name="StackOverflow.Wcf.Services.ClientConnectionService">
<endpoint
address="net.tcp://localhost:9988/ClientConnectionService/"
binding="netTcpBinding"
contract="StackOverflow.Wcf.Services.Contracts.IClientConnectionService"
></endpoint>
</service>
</services>
</system.serviceModel>
一旦完成,我们就有了一个正在运行的WCF服务。现在让我们将注意力转向将使用此服务的客户端。
WCF客户端
这只是一个控制台应用程序,它具有WCF服务的引用,它创建了代理类来调用服务上的方法。
public class ClientConnectionServiceProxy : ClientBase<IClientConnectionService>
{
public bool Connect(string message)
{
return base.Channel.Connect(message);
}
}
请注意,我们已从服务端使用IClientConnectionService
接口/合同。 ClientBase<T>
是WCF框架类。
这是使用上面定义的代理类调用WCF服务的程序类。
class Program
{
static void Main(string[] args)
{
using (ClientConnectionServiceProxy proxy = new ClientConnectionServiceProxy())
{
bool isCallSuccessful = proxy.Connect(string.Empty);
}
}
}
这是客户端配置:
<system.serviceModel>
<client>
<endpoint
address="net.tcp://localhost:9988/ClientConnectionService/"
binding="netTcpBinding"
contract="StackOverflow.Wcf.Services.Contracts.IClientConnectionService"
></endpoint>
</client>
</system.serviceModel>
如何运行
从GITHUB下载源代码后,打开VS2017中的StackOverflow.Wcf.sln文件(这就是我用来开发它的内容 - 不确定是否可以在VS2015中打开它)并点击F5。您可以设置断点来逐步执行代码并根据需要进行编辑。
希望这说清楚 - 在下面的评论中留下任何问题。