给出wsdl,快速简单地实现WCF Web服务?

Jef*_*ege 5 wcf wsdl visual-studio-2010

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

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

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

svcutil.exe thewsdl.wsdl thexsd.xsd /language:c# /out:ITestService.cs
Run Code Online (Sandbox Code Playgroud)

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

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

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

The provided URI scheme 'http' is invalid; expected 'https'.
Run Code Online (Sandbox Code Playgroud)

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

编辑:

我正在为此添加一笔赏金,因为最初的问题似乎没有引起人们的注意.

但是,让我们来解决问题.我正在尝试针对客户的SOAP服务编写客户端.作为开发的一部分,我想创建自己的测试WCF服务,它实现相同的WSDL.

所以我有一个下载的.wsdl文件和一个相关的.xsd文件,我想用VS2010的调试器创建一个我可以测试的服务.

对于我来说,这项服务是独立运行还是在IIS内运行,或者它是否可以稳定生产并不重要.我想要的只是一个接受客户网站可以接受的请求的服务,并将响应返回给我需要它返回的客户端,以便测试我对它们的处理.

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

Chr*_*rda 5

因为你想要一个完整的服务来调用而不是嘲笑它.

跟着这些步骤:

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


Chr*_*rda 1

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

下面的示例设置:

var mock = new Mock<IFoo>();
mock.Setup(foo => foo.DoSomething("ping")).Returns(true);
Run Code Online (Sandbox Code Playgroud)

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

var myObject = new IFoo;
var resp = myObject.DoSomething("whateverwillbeoverriddenbyping");
Run Code Online (Sandbox Code Playgroud)

和 resp 将是真实的。

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