我已经构建了一个小型WCF服务,我试图为其构建单元测试。我已在本地使用数据库部署此服务,该服务可以正常工作,可以保存和读取数据库中的数据。我在与控制台应用程序相同的解决方案中创建了一个单独的项目,其中包含服务引用以使用此服务。
代码如下所示:
服务合同
[ServiceContract]
public interface IUserService
{
//When testing in the browser use verb GET
[OperationContract]
[WebInvoke(Method="POST", UriTemplate = "/CreateNewUserAccount?userNameValue={userName})]
void CreateNewUserAccount(string userName);
}
服务实施:
public void CreateNewUserAccount(string userName)
{
var userContorller = new UserController();
userContorller.addNewUser(userName);
}
带有服务参考的控制台客户端:
static void Main(string[] args)
{
try
{
UserServiceClient serviceClient = new UserServiceClient("");
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadKey();
}
以下是我在浏览器中调用服务的示例: http://localhost:8654/Services/UserService/UserService.svc/CreateNewUserAccount?userNameValue=testUser
我确认在本地运行服务时这是有效的。现在,我从控制台客户端收到的例外是:
无法找到名称为''的端点元素和合同' SerficeReference.IUserService'在ServiceModel客户端配置部分。
当我链接服务引用时,看起来我缺少端点并且app.config中没有生成任何内容。我在app.config中尝试了很多配置,但我似乎无法做到这一点。当我尝试在控制台应用程序中实例化服务客户端时发生异常。我的app.config看起来像这样:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
</configuration>
任何帮助都将不胜感激。
答案 0 :(得分:0)
在配置文件中未生成客户端端点配置的原因是从RESTful WCF服务is not supported生成客户端代码。
非SOAP HTTP服务没有元数据标准。作为服务的调用者,您只需直接调用它即可。
您可以通过多种方式使用.net中的RESTful端点,包括:
在所有这些实例中,您需要将[OperationContract]属性添加到服务操作协定定义中,否则WCF运行时将不会公开此操作。
答案 1 :(得分:-1)
顺便说一句,您的CreateUserAccount
缺少OperationContract
属性。
请添加并再次尝试服务参考。
在COnsole项目中添加服务引用时,.NET会将命名端点添加到您的app.config中。 (默认值)
我在你的app.config中没有看到。确保您正确添加了引用。
之后你需要做,
UserServiceClient serviceClient = new UserServiceClient(); // default endpoint
OR
UserServiceClient serviceClient = new UserServiceClient(namedEndpoint); // from app.config
从您的代码中,您明确要求WCF在App.Config中使用名为空字符串的端点实例化客户端代理。 (“”)这是问题。
如果由于某种原因,您的App.config没有端点和绑定详细信息,您也可以通过编程方式执行此操作:
// programmatic binding and address
var binding = new BasicHttpBinding();
var endpointAddress = new EndpointAddress("localhost_service_address");
var serviceClient = new UserServiceClient(binding, endpointAddress);