我已经花了5个小时了,而且我已经增加了30个小时写这份合同优先规格(“激进”的截止日期,ergo愚蠢),我看不到我缺少的东西。

我不希望单向操作,因为我期望有故障。我已经建立了一个简单的WCF服务,并检查了它生成的WSDL 往回走了一个空白方法,但是我一直盯着它很长时间(WSDL 1.1在最好的时间非常烦人 - 请在2.0上滚动),以至于我再也看不到魔术是什么。

谁能提供一些非常简单的WSDL来解释魔术?使用此WSDL,我正在针对JAX-WS 2.2和WCF 3.5/4.0。我正在手工编写WSDL,每次尝试构建代理时(在Java或.NET中)时,它总是用返回消息构建一种方法。我正在失去它。

有帮助吗?

解决方案

“无效”方法并不一定意味着它是单向操作。以下两个操作不同:

[ServiceContract]
public interface ITest
{
    [OperationContract(IsOneWay = true)]
    void Process1();
    [OperationContract]
    void Process2();
}

第一个实际上是一个单向操作 - 服务器抛出的任何异常 /故障都不会传播给客户端,而在第二个服务器中,尽管服务器抛出了异常(例如, FaultException),例外将返回到呼叫者。

更新: :为了回答标题中提出的问题,WSDL解析器决定如果操作的输出消息的架构为空,则决定生成一个void操作(至少是WCF使用的操作)。

例如,在以下代码中:

public class StackOverflow_8316567
{
    [ServiceContract]
    public interface ITest
    {
        [OperationContract(IsOneWay = true)]
        void Process1();
        [OperationContract]
        void Process2();
        [OperationContract]
        int Add(int x, int y);
    }
    public class Service : ITest
    {
        public void Process1() { }
        public void Process2() { }
        public int Add(int x, int y) { return x + y; }
    }
    static Binding GetBinding()
    {
        var result = new BasicHttpBinding();
        return result;
    }
    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
        host.AddServiceEndpoint(typeof(ITest), GetBinding(), "");
        host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
        host.Open();
        Console.WriteLine("Host opened");

        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    }
}

如果您运行并浏览 http:// localhost:8000/service?wsdl 您会看到:

  1. 操作 Process1 (在WSDL:PORTTYPE/WSDL:操作下)只有输入消息
  2. 两个都 AddProcess2 (R/R操作)既有输入和输出消息

现在,这两个操作的输出消息的消息部分在导入的架构中引用其架构(在 http:// localhost:8000/service?xsd = xsd0)。您可以看到:

  1. 响应的架构 Process2 操作(复杂类型 Process2Response)是一个空元素(即一个空序列)
  2. 响应的架构 Add 手术 (AddResponse)是一个包含一个元素的序列(一个 xs:int 价值)。

因此处理器将生成一个 void 方法 Process2 (因为它没有返回任何内容)和一种非空隙方法 Add.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top