什么是WCF OperationContract?我真的不明白它的作用
我正在尝试使用WCF测试客户端来测试我已构建的WCF服务.
该服务有一个方法"SubmitRequest".
[OperationContract]
Response SubmitRequest(Request request);
Run Code Online (Sandbox Code Playgroud)
当我加载WCF测试客户端时,该方法显示为灰色,并显示消息"WCF测试客户端不支持此操作,因为它使用类型WcfLibrary.Objects.Request
下面是类型定义,有人看错了吗?
[DataContract]
public class Request
{
[DataMember]
public string LoanNumber { get; set; }
[DataMember]
public string ClientCode { get; set; }
[DataMember]
public Region Region { get; set; }
[DataMember]
public RequestType RequestType { get; set; }
[DataMember]
public List<RequestParameter> RequestParameters { get; set; }
[DataMember]
public List<MspWebCallType> MspWebCallsForXmlRequest { get; set; }
[DataMember]
public Hashtable XmlRequestParameters { get; set; }
public Request(string loanNumber, string clientCode, Region region, RequestType requestType, List<RequestParameter> requestParameters) …Run Code Online (Sandbox Code Playgroud) 以每个服务上有10个服务和20个方法的项目为例.
所有服务都从具有安全检查的基本服务继承.每种方法的第一件事就是调用安全检查.如果出现问题,则会引发安全性异常.
问题是:我是否需要在每个方法(OperationContract)上指定FaultContract,还是可以在中央定义中执行一次?
我很好奇是否有人可以概述服务器端哪些类型的WCF合同(接口)更改会破坏尝试发送消息的客户端,以及原因.我相信WCF可以处理某些差异,但我不确定你可以安全地改变什么,以及你不能做什么.
一位朋友在这里问了一个类似的问题
向WCF ServiceContract添加方法是否会破坏现有客户端?
编辑:正如John Saunders所指出的那样,改变合同通常不是一个好主意,但是内置的东西允许一些版本容忍(ExtensionDataObject等?).我想知道版本容差的灵活性.
[ServiceContract(Namespace = "http://schemas.mycompany.com/", Name = "MyService")]
public interface IMyService
{
[OperationContract(Name = "MyOperation")
OperationResponse MyOperation(OperationRequest request);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,Action和的重点是ReplyAction什么?
编辑:我应该澄清我的问题......
如果我没有指定这些部分,我的wsdl会有什么不同?它不会只是使用命名空间,服务名称和opeartion名称的某种组合吗?
我已宣布两项服务合同如下:
[ServiceContract]
public interface IContract1
{
[OperationContract]
double Add(int ip);
}
[ServiceContract]
public interface IContract2
{
[OperationContract]
double Add(double ip);
}
Run Code Online (Sandbox Code Playgroud)
我有一个实现这两个合同的类.我为这两个合同创建了两个端点.但我无法从客户端代码访问该服务.当我尝试更新服务引用时,它显示一个很大的错误:
元数据包含无法解决的错误....没有端点监听...等.
我知道你不能拥有两个OperationContract同名的s,但是有可能在不同的服务合同中有两个同名但签名不同的操作合同吗?
c# wcf multiple-inheritance servicecontract operationcontract
我[DataMember(IsRequired=true)]用来制作所需的DataContract属性.对于OperationContract参数似乎没有一些IsRequired.如何使它们成为必需而不允许null?
在SoapUI工具中,OperationContract中的参数似乎是可选的.虽然这绝不是可选的或null.
WCF接口:
[OperationContract]
IsClientUpdateRequiredResult IsClientUpdateRequired(IsClientUpdateRequiredInput versie);
...
[DataContract]
public class IsClientUpdateRequiredInput
{
[DataMember(IsRequired=true)]
public string clientName { get; set; }
[DataMember(IsRequired = true, Order = 0)]
public int major { get; set; }
[DataMember(IsRequired = true, Order = 1)]
public int minor { get; set; }
[DataMember(IsRequired = true, Order = 2)]
public int build { get; set; }
[DataMember(IsRequired = true, Order = 3)]
public int revision { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
soapUI请求模板:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/" …Run Code Online (Sandbox Code Playgroud) 我想知道如何根据需要在WCF中指定OperationContract方法的参数,以便生成的xsd包含minOccurs ="1"而不是minOccurs ="0".
例:
[ServiceContract(Namespace = "http://myUrl.com")]
public interface IMyWebService
{
[OperationContract]
string DoSomething(string param1, string param2, string param3);
}
Run Code Online (Sandbox Code Playgroud)
生成这个xsd:
<xs:element name="DoSomething">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="param1" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="param2" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="param3" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)
但我想在代码中定义minOccurs ="1"而无需在xsd文件中手动修复它.
我对WCF很新,只是有一个关于如何正确获取MessageContract继承的问题.我的设置的简化版本如下 - "基本"消息类型,然后是从其继承的另一个"测试"消息.
[MessageContract]
public abstract class BaseMessage
{ }
[MessageContract]
public class TestMessage : BaseMessage
{ }
Run Code Online (Sandbox Code Playgroud)
然后我在ServiceContract上有一个异步的OperationContract定义为:
[OperationContract(AsyncPattern = true)]
IAsyncResult BeginFindRequest(BaseMessage request, AsyncCallback callback, object asyncState);
Run Code Online (Sandbox Code Playgroud)
我得到的问题是在调用BeginFindRequest方法并传入请求参数的TestMessage实例时,WCF框架将TestMessage实例反序列化为服务/服务器端的BaseMessage.由于这被定义为抽象类,因此会导致以下错误:
"消息无法反序列化为MessageContract类型的BaseMessage,因为它没有默认的(无参数)构造函数."
从我可以在MessageContract继承上找到的有限信息,它似乎应该工作.
所以我的问题是 - 为了让这个工作,我错过了什么; 或者我应该在ServiceContract上专门针对该类型定义一个单独的OperationContract - 缺点是我最终可能会有许多额外的OperationContracts?
wcf ×10
c# ×4
.net ×1
action ×1
asp.net ×1
collections ×1
datacontract ×1
datamember ×1
inheritance ×1
reply ×1
soap ×1
soapui ×1
wsdl ×1