0

我在这上面花了 5 个小时,而且我已经花了 30 个小时来编写这个以合同为先的规范(“激进的”截止日期,所以我很愚蠢),我看不出我错过了什么。

我不想要单向操作,因为我预计会出现故障。我已经构建了一个简单的 WCF 服务并检查了它生成的 WSDL,它确实往返于一个 void 方法,但我一直盯着它这么久(而且 WSDL 1.1 在最好的时候是如此烦人 - 滚上 2.0拜托)我再也看不到魔术是什么了。

谁能提供一些非常简单的 WSDL 来解释魔法?我的目标是 jax-ws 2.2 和 WCF 3.5/4.0 与这个 WSDL。我正在手写 WSDL,每次我尝试构建代理(在 java 或 .net 中)时,它总是构建一个带有返回消息的方法。我正在失去它。

4

1 回答 1

4

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

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

第一个实际上是单向操作 - 服务器抛出的任何异常/错误都不会传播到客户端,而在第二个中,虽然它不会“返回”任何东西,但如果服务器抛出异常(例如,a 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:operation 下)只有一个输入消息
  2. 和(r/r 操作) 都有输入和输出Add消息Process2

现在,这两个操作的输出消息的消息部分在导入的模式中引用了它们的模式(在http://localhost:8000/service?xsd=xsd0)。你可以看到:

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

所以处理器会生成一个for 的void方法Process2(因为它不返回任何东西)和一个非 void 的Add.

于 2011-11-29T19:48:21.513 回答