我创建了一个简单的WCF服务接口:
namespace ApiDoc.SampleApi
{
/// <summary>
/// Contract
/// </summary>
/// <webMethodsPrefix>Web</webMethodsPrefix>
[ServiceContract(Namespace = "apidoc.sampleapi.com", Name = "SampleApi")]
public interface IService
{
[WebGet( UriTemplate = "Add?value1={value1}&value2={value2}&apiKey={apiKey}", BodyStyle = WebMessageBodyStyle.Bare)]
AddRs AddWithHttpGet(int value1, int value2, string apiKey);
[WebInvoke(Method = "POST", UriTemplate = "Add", BodyStyle = WebMessageBodyStyle.Bare)]
AddRs Add(AddRq rq);
}
}
在这种情况下,它只是一个简单的添加操作。 它适用于Xml,Soap和Json。 Get和Post。
当我创建此服务的服务引用时,我遇到的问题是在Soap中。我可以调用“Add”和“AddWithHttpGet”这两个函数,而我只想看“添加”。
我原本以为它与使用“OperationContract”属性有关,但似乎它不再使用了。我尝试仅将此属性添加到POST Add,但它没有任何区别。我使用的是ASP.NET 4.0。
另一个解决方案是为Soap创建一个不同的IService,但我宁愿将它们全部保存在一个界面中。
这是我的配置文件:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<bindings>
<webHttpBinding>
<binding name="jsonHttpBinding" />
<binding name="xmlHttpBinding" />
</webHttpBinding>
</bindings>
<services>
<service name="ApiDoc.SampleApi.Service" behaviorConfiguration="ApiDocSampleApiBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost/ApiDoc.SampleApi/" />
</baseAddresses>
</host>
<endpoint name="soap" address="" binding="basicHttpBinding" bindingNamespace="apidoc.sampleapi.com" contract="ApiDoc.SampleApi.IService" lockAttributes="bindingNamespace" />
<endpoint name="json" address="json" binding="webHttpBinding" bindingNamespace="apidoc.sampleapi.com" bindingConfiguration="jsonHttpBinding" contract="ApiDoc.SampleApi.IService" behaviorConfiguration="JsonBehavior" />
<endpoint name="xml" address="xml" binding="webHttpBinding" bindingNamespace="apidoc.sampleapi.com" bindingConfiguration="xmlHttpBinding" contract="ApiDoc.SampleApi.IService" behaviorConfiguration="XmlBehavior" />
<endpoint name="mex" address="mex" binding="mexHttpBinding" bindingNamespace="apidoc.sampleapi.com" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="JsonBehavior">
<webHttp defaultOutgoingResponseFormat="Json" />
</behavior>
<behavior name="XmlBehavior">
<webHttp defaultOutgoingResponseFormat="Xml" />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="ApiDocSampleApiBehavior">
<serviceMetadata httpGetEnabled="true" httpGetUrl="" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" minFreeMemoryPercentageToActivateService="0" />
</system.serviceModel>
...
答案 0 :(得分:2)
我会创建一个单独的界面。
将您的界面视为双方之间的真实合约。您正在使用它来定义客户端可用的操作。如果它在合同中,则可以使用。
我只是创建了两份合约,而不是寻找某种“隐形墨水”,这种墨水可以使合同的某些部分可供某些客户使用。我只想创建两份合约。
答案 1 :(得分:0)
我有点困惑。 OperationContractAttribute
是必需的。它本身的WebGetAttribute
不应该做任何事情,因为该方法不作为操作公开。
至于隐藏操作,这也是不可能的。如果界面是你的合同,并且你肯定想要两个不同的合同,那么你将需要两个不同的接口。
如果您不想复制代码,那么您仍然可以使用继承。让一个interace定义您的SOAP操作Add
,然后从中继承以添加AddWithHttpGet
。然后,通过定位端点中的不同接口,SOAP端点将具有一个操作,而REST端点将具有两个。
答案 2 :(得分:0)
试试这个你想在c#
中隐藏webmethod表格肥皂标题 [SoapDocumentMethod(ParameterStyle = SoapParameterStyle.Bare), WebMethod]
public string Operation(RIL_OB_MSG RIL_OB_MSG)
{
}