从SOAP WCF客户端隐藏REST方法

时间:2012-01-13 09:45:23

标签: asp.net wcf

我创建了一个简单的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>
...

3 个答案:

答案 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)
    {
    }