我正在开发一个简单的WCF服务MiniCalcService
,它只有一个操作Add
。客户端和主机都是控制台应用程序。客户端应用程序接收每个操作所需的操作数,并将它们传递给服务。该服务返回将在客户端控制台上显示的结果。
昨天这对我有用。今天当我尝试同样的事情时,它会引发以下异常:
http://localhost:8091/MiniCalcService没有可以接受该消息的端点。
这是Stack Trace。并非它可能很重要,但MiniCalcClient
是在Visual Studio中开发的,MiniCalcService
和MiniCalcHost
是在SharpDevelop中开发的。
MiniCalcHost :
using(ServiceHost host = new ServiceHost(typeof(MiniCalcService.Service), new Uri("http://localhost:8091/MiniCalcService")))
{
host.AddServiceEndpoint(typeof(MiniCalcService.IService),new BasicHttpBinding(),"Service");
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
host.Description.Behaviors.Add(smb);
host.Open();
Console.WriteLine("Serving MiniCalcService since {0}", DateTime.Now);
Console.Write("Press ENTER key to terminate the MiniCalcHost . . . ");
Console.ReadKey(true);
}
MiniCalcClient:
static string Calculator(string operation, params string[] strOperands)
{
EndpointAddress ep = new EndpointAddress("http://localhost:8091/MiniCalcService");
IService proxy = ChannelFactory<IService>.CreateChannel(new BasicHttpBinding(), ep);
int[] operands;
string result = string.Empty;
try { operands = Array.ConvertAll(strOperands, int.Parse); }
catch (ArgumentException) { throw; }
switch (operation)
{
case "add":
result = Convert.ToString(proxy.Add(operands));//<---EXCEPTION
break;
default:
Console.WriteLine("Why was this reachable again?");
break;
}
return result;
}
服务合同服务:
[ServiceContract(Namespace="learning.wcf.MiniCalc")]
public interface IService
{
[OperationContract]
double Add(params int[] operands);
}
您能否帮我确定造成此异常的原因?
解决方案:我改变了这一行:
EndpointAddress ep = new EndpointAddress("http://localhost:8091/MiniCalcService");
到此:
EndpointAddress ep = new EndpointAddress("http://localhost:8091/MiniCalcService/Service");
它有效。
答案 0 :(得分:2)
我不确定你是否可以在WCF服务电话中使用params
....似乎没必要,反正....
您可以尝试这两个服务合同,只是为了看看它们是否有用:
[ServiceContract(Namespace="learning.wcf.MiniCalc")]
public interface IService2
{
[OperationContract]
int Add(int op1, int op2);
}
和
[ServiceContract(Namespace="learning.wcf.MiniCalc")]
public interface IService3
{
[OperationContract]
int Add(List<int> operands);
}
我只是想知道从你的服务合同中删除params
是否可以让它运行 - 乍一看似乎一切都很好......
好的,所以这不是第一次尝试......
嗯 - 非常明显,真的:你在服务主机实例化中使用using
块:
using(ServiceHost host = new ServiceHost(typeof(MiniCalcService.Service), new Uri("http://localhost:8091/MiniCalcService")))
{
host.AddServiceEndpoint(typeof(MiniCalcService.IService),new BasicHttpBinding(),"Service");
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
host.Description.Behaviors.Add(smb);
host.Open();
Console.WriteLine("Serving MiniCalcService since {0}", DateTime.Now);
Console.Write("Press ENTER key to terminate the MiniCalcHost . . . ");
}
因此,当代码到达结束括号}
时,ServiceHost
实例将被处理,因此服务主机关闭。已经没有正在运行的服务主机了!
在调用host.Open()
之后,您需要停止执行代码,例如
Console.ReadLine();
或其他。
所以你第一次声称主机正在运行确实没有阻止 - 它正在短暂运行然后立即再次终止.....