我的WCF项目中出现以下错误:
“System.ServiceModel.dll中发生了'System.InvalidOperationException'类型的未处理异常
其他信息:找不到引用ServiceModel客户端配置部分中的合同“IPhiFeed”的默认端点元素。这可能是因为没有为您的应用程序找到配置文件,或者因为在客户端元素中找不到与此合同匹配的端点元素。“
WCF项目有点实验性:是托管和非托管C ++以及C#的混合体。我已经在纯C#中工作,但是我必须从非托管C ++中使用WCF,因此需要在WCF周围编写C ++包装。
更新
根据要求,以下是抛出异常的代码:
// WCF library written in C#
public class EngineAPI : IEngineAPI
{
public FeedClient client;
// constructor
public EngineAPI()
{
// the line below in this C# library works *perfectly* when called from a C#
// console app, but it fails when a C++ console app calls the same C# library
// UPDATE: exception fixed if you copy app.config to out.exe.config, see comments below
client = new FeedClient(); // << exception here
}
.....
}
// NOTE: the line "client = new FeedClient" instantiates generatedProxy.cs,
// which is generated with svcutil
// NOTE: if I temporarily delete "app.config" from the pure C# project, it generates *exactly* the same error as I'm getting when I attempt to call everything from the separate C++ project with managed code.
更新
发现问题,它与代码无关:您必须将app.config复制到out.exe.config。我现在有一个100%正在运行的C ++ / CLI项目调用一个使用WCF的C#库。请参阅下面的评论。
答案 0 :(得分:1)
通常,当您在客户端项目中使用wcf时,配置文件中的条目描述了要使用的绑定以及服务所在的端点:
我假设您的FeedClient类是继承自ClientBase(IPhiFeed)的类。 ClientBase实际上定义了许多构造函数,如果你调用没有参数的构造函数,它将尝试在配置文件中找到“默认”客户端点;在这种情况下,没有一个,因为配置中定义的唯一端点具有名称。要纠正这个问题,您可以执行以下两项操作之一:您可以调用ClientBase构造函数,该构造函数接受带有端点名称的字符串参数:ClientBase<IPhiFeed>("MyService")
或者您可以更改配置文件,以便端点没有名称:
<强>编辑:强> 您在问题中的代码看起来像C#代码。 FeedClient类是否继承自ClientBase?如果是,并且调用它的C#代码工作,那么什么是不起作用的C ++代码?通常,在C ++代码中,您可以同时拥有托管代码和非托管代码;这是非托管代码可以调用托管代码。在非托管项目中,您应该执行以下操作:转到项目的属性页,单击“配置属性”,然后单击“常规”;在“项目默认值”下的常规选项卡中,底部选项中的第二个选项应为“公共语言运行时支持”,请确保将其设置为“公共语言运行时支持”(/ clr)。如有必要,添加包含FeedClient类的项目作为对非托管项目的引用。然后,您应该能够直接在非托管代码中实例化FeedClient类:
MyNamespace::FeedClient wcfClient;
wcfClient.SomeMethod() // Add parameters as appropriate...