6

我正在编写一个客户端来访问将由第三方托管的 SOAP Web 服务。我有定义接口和数据的 WSDL 和 XSD。

我从 WSDL 创建服务引用没有问题,但是我在构建一个实现它的简单 Web 服务时遇到了问题,我可以用它来测试。(第三方的服务还没有准备好,但即使它正在运行,我仍然想对我自己的测试服务器进行初始测试,而不是针对他们的。)

我四处浏览,显然我可以使用 svcutil 为服务生成一个接口:

svcutil.exe thewsdl.wsdl thexsd.xsd /language:c# /out:ITestService.cs

这会生成一个包含服务接口定义的文件。但现在呢?

我认为最简单的方法是构建一个自托管服务,因此我创建了一个新的控制台应用程序,并在其中实现了一个从服务接口定义派生的类,并使用 ServiceHost 启动它。

它运行,当它运行时,我能够在我的客户端应用程序中创建一个服务引用。但是当我尝试从客户端应用程序调用它时,我收到一个错误:

The provided URI scheme 'http' is invalid; expected 'https'.

解决这个问题的最简单方法是什么?有没有一种简单的方法可以简单地关闭身份验证和授权,并简单地允许不受限制的访问?

编辑:

我正在为此增加赏金,因为最初的问题似乎没有引起注意。

但是,让我们进入症结所在。我正在尝试针对客户的 SOAP 服务编写客户端。作为开发的一部分,我想创建自己的测试 WCF 服务,它实现了相同的 WSDL。

所以我有一个下载的 .wsdl 文件和一个关联的 .xsd 文件,我想用它们创建一个可以使用 VS2010 调试器进行测试的服务。

这个服务是独立运行,还是在 IIS 中运行,或者它是生产稳定的,对我来说并不重要。我想要的只是接受客户站点将接受的请求的服务,并将响应返回给我需要它返回的客户,以测试我对它们的处理。

我如何到达那里?我尝试添加 WCF 服务库,然后在其中使用 svcutil.exe 添加我的新服务,但它似乎没有使用服务器端样板填充 app.config,我尝试重建它没有没用。

4

2 回答 2

5

因为您想要一个完整的服务来调用而不是模拟它。

按着这些次序:

  1. 创建新的“WCF 服务应用程序”项目
  2. 将 wsdl 和 xsd 复制到项目中
  3. 选择您的 wsdl 文件并查看属性部分并从完整路径复制位置
  4. 右键单击解决方案资源管理器中的项目并选择“添加服务引用...”
  5. 对于服务地址,粘贴在上一步中复制的 wsdl 的位置,然后点击 go。它应该显示您期望的服务操作。
  6. 点击确定
  7. 它应该为您生成所有对象,包括接口和配置文件(尽管此时是配置中的客户端 - 我们必须将其切换为服务)
  8. 现在您应该在 system.serviceModel 部分中添加服务配置部分。由于我不知道您的 wsdl 的细节,您应该做的是在 system.serviceModel 部分中创建服务节点并从生成的客户端节点复制端点节点。例如下面的服务节点,您现在可以空白地址:
 <system.serviceModel>
    <services>
      <service name="YourService">
        <endpoint address=""
               binding="basicHttpBinding" bindingConfiguration="WeatherSoap"
               contract="ServiceReference1.WeatherSoap" name="WeatherSoap" />      
      </service>
  1. 删除配置中的客户端节点
  2. 在服务中,它在生成项目时实现了一个不同的接口,因此您需要将实现的接口替换为上面端点的合同属性中列出的接口。然后实现它的成员,它应该爆炸可用的操作。您可以填写您希望服务操作返回的任何内容。
  3. 根据 wsdl 中的内容,我们可能需要做更多的事情来允许必要的绑定运行——比如设置 wsHttpbinding、netTCPbinding 等。
于 2012-07-04T05:19:01.113 回答
1

我用Moq来处理这个问题。基本上在单元测试中,您指定接口(这将通过添加服务引用或使用 svcutil 为您生成)以及如果您调用它,您希望它返回什么。

下面的示例设置:

var mock = new Mock<IFoo>();
mock.Setup(foo => foo.DoSomething("ping")).Returns(true);

那么,当您想最小起订量您的服务电话时

var myObject = new IFoo;
var resp = myObject.DoSomething("whateverwillbeoverriddenbyping");

和resp将是真实的。

除了使用 Moq,还有其他选择。这些选项都涉及采用接口并注入它的不同版本。例如,您还可以通过将接口传递给类构造函数来进行构造函数注入模拟。

于 2012-07-03T06:59:31.957 回答