C# 客户可以';在Windows服务中找不到WCF的端点元素
我正在尝试将WCF服务放入Windows服务中。我使用svcutil来使用CalculatorService.cs和output.config。我将output.config的内容放入App.config,并在其中编写一个客户端,包括CalculatorService.cs。当它运行时,我得到一个错误,“在ServiceModel客户机配置部分中找不到引用约定'IAnswerResult'的默认端点元素”。在我的客户端中,我刚刚复制了向导所说的要使用的内容:C# 客户可以';在Windows服务中找不到WCF的端点元素,c#,wcf,windows-services,wcf-binding,C#,Wcf,Windows Services,Wcf Binding,我正在尝试将WCF服务放入Windows服务中。我使用svcutil来使用CalculatorService.cs和output.config。我将output.config的内容放入App.config,并在其中编写一个客户端,包括CalculatorService.cs。当它运行时,我得到一个错误,“在ServiceModel客户机配置部分中找不到引用约定'IAnswerResult'的默认端点元素”。在我的客户端中,我刚刚复制了向导所说的要使用的内容: protected void Pag
protected void Page_Load(object sender, EventArgs e)
{
AnswerResultClient client = new AnswerResultClient(); // error here
client.QuestionAnswered("1", "2", "3");
}
在客户端(已生成)的App.config中,我有以下内容,但它告诉我合同“IAnswerResult”无效。我不知道为什么。。。它是由svcutil生成的
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IAnswerResult" />
</basicHttpBinding>
<netTcpBinding>
<binding name="NetTcpBinding_IAnswerResult" />
</netTcpBinding>
</bindings>
<client>
<endpoint address="http://localhost:6255/CalculatorService" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IAnswerResult" contract="IAnswerResult"
name="BasicHttpBinding_IAnswerResult" />
<endpoint address="net.tcp://localhost:6256/CalculatorService"
binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IAnswerResult"
contract="IAnswerResult" name="NetTcpBinding_IAnswerResult">
<identity>
<servicePrincipalName value="host/Server2012" />
</identity>
</endpoint>
</client>
</system.serviceModel>
Windows服务/WCF服务中的App.config:
namespace EternaService
{
[ServiceContract(Namespace = "http://EternaService")]
public interface IAnswerResult
{
[OperationContract]
string QuestionAnswered(string person_int, string course_int, string lesson_int);
}
public class CalculatorService : IAnswerResult
{
public string QuestionAnswered(string person_int, string course_int, string lesson_int)
{
string result = "";
// Have input, now do something with it.
return result;
}
}
public partial class EternaService : ServiceBase
{
public ServiceHost serviceHost = null;
public EternaService()
{
this.CanStop = true;
this.CanHandlePowerEvent = true;
this.CanHandleSessionChangeEvent = true;
this.CanPauseAndContinue = true;
this.CanShutdown = true;
InitializeComponent();
}
protected override void OnStart(string[] args)
{
if (serviceHost != null)
{
serviceHost.Close();
}
serviceHost = new ServiceHost(typeof(CalculatorService));
serviceHost.Open();
}
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<system.serviceModel>
<services>
<service name="EternaService.CalculatorService" behaviorConfiguration="myServiceBehave">
<host>
<baseAddresses>
<add baseAddress="http://localhost:6255/CalculatorService"/>
<add baseAddress="net.tcp://localhost:6256/CalculatorService"/>
</baseAddresses>
</host>
<endpoint address="http://localhost:6255/CalculatorService" binding="basicHttpBinding" contract="EternaService.IAnswerResult" />
<endpoint address="net.tcp://localhost:6256/CalculatorService" binding="netTcpBinding" contract="EternaService.IAnswerResult" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="myServiceBehave">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
在客户端计算器服务类中:
[System.ServiceModel.ServiceContractAttribute(Namespace= "http://CADEEternaService", ConfigurationName="IAnswerResult")]
public interface IAnswerResult
{
[System.ServiceModel.OperationContractAttribute(Action= "http://CADEEternaService/IAnswerResult/QuestionAnswered", ReplyAction= "http://CADEEternaService/IAnswerResult/QuestionAnsweredResponse")]
string QuestionAnswered(string person_int, string course_int, string lesson_int);
[System.ServiceModel.OperationContractAttribute(Action= "http://CADEEternaService/IAnswerResult/QuestionAnswered", ReplyAction= "http://CADEEternaService/IAnswerResult/QuestionAnsweredResponse")]
System.Threading.Tasks.Task<string> QuestionAnsweredAsync(string person_int, string course_int, string lesson_int);
}
[System.ServiceModel.ServiceContractAttribute(命名空间=”http://CADEEternaService,ConfigurationName=“IAnswerResult”)]
公共接口IAnswerResult
{
[System.ServiceModel.OperationContractAttribute(操作=”http://CADEEternaService/IAnswerResult/QuestionAnswered,ReplyAction=http://CADEEternaService/IAnswerResult/QuestionAnsweredResponse")]
回答的字符串问题(字符串人物、字符串课程、字符串课程);
[System.ServiceModel.OperationContractAttribute(操作=”http://CADEEternaService/IAnswerResult/QuestionAnswered,ReplyAction=http://CADEEternaService/IAnswerResult/QuestionAnsweredResponse")]
System.Threading.Tasks.Task QuestionAnsweredAsync(字符串人物、字符串课程、字符串课程);
}
在客户端的app.config中:
<endpoint address="http://localhost:6255/CalculatorService" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IAnswerResult" contract="CADEEternaService.IAnswerResult"
name="BasicHttpBinding_IAnswerResult" />
<endpoint address="net.tcp://localhost:6256/CalculatorService"
binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IAnswerResult"
contract="CADEEternaService.IAnswerResult" name="NetTcpBinding_IAnswerResult">
但它仍然将“cadeeternaneservice.IAnswerResult”标记为一个错误,我也得到了原始错误,“找不到引用契约‘IAnswerResult’的默认端点元素…”。。。但是,我觉得奇怪的是,它在错误消息中对IAnswerResult而不是CadeternanService.IAnswerResult发出吠声。在客户端的配置中,契约需要是完全限定的名称,而不仅仅是接口名称
<endpoint address="http://localhost:6255/CalculatorService"
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IAnswerResult"
contract="EternaService.IAnswerResult"
name="BasicHttpBinding_IAnswerResult" />
<endpoint address="net.tcp://localhost:6256/CalculatorService"
binding="netTcpBinding"
bindingConfiguration="NetTcpBinding_IAnswerResult"
contract="EternaService.IAnswerResult"
name="NetTcpBinding_IAnswerResult">
换句话说,
eternaservice.IAnswerResult
,而不仅仅是IAnswerResult
您需要在合同之前添加生成的服务引用的名称空间。。。。
contract=“xxxxxxx.IAnswerResult
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IAnswerResult" />
</basicHttpBinding>
<netTcpBinding>
<binding name="NetTcpBinding_IAnswerResult" />
</netTcpBinding>
</bindings>
<client>
<endpoint address="http://localhost:6255/CalculatorService" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IAnswerResult" contract="**xxxxx.IAnswerResult**"
name="BasicHttpBinding_IAnswerResult" />
<endpoint address="net.tcp://localhost:6256/CalculatorService"
binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IAnswerResult"
contract="IAnswerResult" name="NetTcpBinding_IAnswerResult">
<identity>
<servicePrincipalName value="host/Server2012" />
</identity>
</endpoint>
</client>
我将两个协定值都更改为“EternaService.IAnswerResult”,但它给出了相同的错误,“在ServiceModel客户端配置部分中找不到引用协定“IAnswerResult”的默认端点元素。”。这可能是因为找不到应用程序的配置文件,或者在客户端元素中找不到与此约定匹配的端点元素。“我尝试使用InEllisSense,但它找不到我能识别的内容。请注意,您在
ServiceContract
上设置的命名空间与该合约的命名空间没有任何关系。服务契约名称空间是SOAP的一部分。正如我前面所说的,完全限定的名称仍然会给出一个错误。在查看app.config时,如果我将鼠标悬停在协定值上,它会说“根据其数据类型'clientContractType'-枚举约束失败,协定值无效”尝试将命名空间更改为不在项目命名空间EternaService{[ServiceContract(命名空间="你的命名空间与你的服务名称相同。我以为你找到了什么…除非我把更改搞砸了。我使用CadeterNaService作为合同命名空间编辑了原始帖子。在客户端应用中,你需要从Windows服务添加对WCF服务库项目的引用,并将以下using语句添加到他在Windows服务项目中创建了**.cs文件。请尝试按照本教程进行操作。关键是客户端中对WCF服务的引用。奇怪的是,我创建了ServiceReference ok,但无法使用“using”来显示它.因此,我完全限定了它:CalculatorServiceReference.AnswerResultClient客户端=新的CalculatorServiceReference.AnswerResultClient(“NetTcpBinding_IAnswerResult”);
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IAnswerResult" />
</basicHttpBinding>
<netTcpBinding>
<binding name="NetTcpBinding_IAnswerResult" />
</netTcpBinding>
</bindings>
<client>
<endpoint address="http://localhost:6255/CalculatorService" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IAnswerResult" contract="**xxxxx.IAnswerResult**"
name="BasicHttpBinding_IAnswerResult" />
<endpoint address="net.tcp://localhost:6256/CalculatorService"
binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IAnswerResult"
contract="IAnswerResult" name="NetTcpBinding_IAnswerResult">
<identity>
<servicePrincipalName value="host/Server2012" />
</identity>
</endpoint>
</client>