WSDL解析器如何决定为请求/回复操作生成一个无效方法?
-
25-10-2019 - |
题
我已经花了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 您会看到:
- 操作
Process1
(在WSDL:PORTTYPE/WSDL:操作下)只有输入消息 - 两个都
Add
和Process2
(R/R操作)既有输入和输出消息
现在,这两个操作的输出消息的消息部分在导入的架构中引用其架构(在 http:// localhost:8000/service?xsd = xsd0)。您可以看到:
- 响应的架构
Process2
操作(复杂类型Process2Response
)是一个空元素(即一个空序列) - 响应的架构
Add
手术 (AddResponse
)是一个包含一个元素的序列(一个xs:int
价值)。
因此处理器将生成一个 void
方法 Process2
(因为它没有返回任何内容)和一种非空隙方法 Add
.
不隶属于 StackOverflow