0

我将 Web 引用添加到 WCF 服务

我想修改代理文件由web服务参考工具自动生成

我想在每个方法属性之前添加

[OperationContract]
[WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Json,

BodyStyle = WebMessageBodyStyle.Wrapped,

UriTemplate = "LogIn/{username}/{password}")]

任何想法如何做到这一点

此致

4

2 回答 2

1

你好呀:

我之所以添加这个,是因为上面的帖子并没有明确说明如何在客户端代理代码中添加 WebInvoke 属性,所以我将其提供给大家,以消除对其完成方式的任何混淆。

步骤1

转到您的 VS 项目文件夹并找到您的“服务引用”文件夹。找到您正在使用的参考文件夹,如果您在添加服务时使用了默认文件夹,那么应该类似于“ServiceReference1”。

在该文件夹中有一个 Reference.cs 文件,这是您更新方法所需的文件。

例如,假设您创建了一个 REST 服务并且您的 WebInvoke 属性被忽略了。你可以在那里添加它们。

第2步

只需找到以“[System.ServiceModel.OperationContractAttribute”开头的行:

应该看起来像这样

[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/YourMethodName", ReplyAction="http://tempuri.org/IService1/YourMethodNameResponse")]

第 3 步

现在,在该行之后,您要添加 WebInvoke 代码,如下所示:

[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/YourMethodName", ReplyAction="http://tempuri.org/IService1/YourMethodNameResponse")]

[System.ServiceModel.Web.WebInvoke(Method = "POST", BodyStyle = System.ServiceModel.Web.WebMessageBodyStyle.WrappedRequest, RequestFormat = System.ServiceModel.Web.WebMessageFormat.Json, ResponseFormat = System.ServiceModel.Web.WebMessageFormat.Json, UriTemplate = "/YourMethodName")]

这就是它的全部内容。

注意:如果您删除了 WCF 服务引用,您所做的更改将会消失。因此,请确保在完成更改后备份文件。

于 2014-05-17T15:54:37.253 回答
0

更新答案: 您似乎已经使用 VS 中的“添加服务引用”对话框创建了代理代码。VS ASR 对话框不完全支持 WCF REST,因此代理代码缺少 [WebInvoke] 属性。您可以尝试[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)]在客户端代理中的操作上添加属性吗?来源: 当 [OperationContract] 方法中使用多个参数时,WCF 服务代理抛出异常

如果我清楚地理解你的问题。如果您想在每个方法之前添加 WebInvoke 属性,请转到您的 WCF 服务接口类,例如 ( IService.cs )。可能是放在您的 App_Code 文件夹中。

[ServiceContract]
public interface IService
{ 
 [OperationContract]
 [WebInvoke(Method = "GET",ResponseFormat = WebMessageFormat.Json,BodyStyle = WebMessageBodyStyle.Wrapped,UriTemplate = "LogIn/{username}/{password}")]
void DoWork();

}

如果要更改代理类设置,请转到 system.ServiceModel 标记下的 Web 配置。

 <system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IService" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                useDefaultWebProxy="true">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <security mode="None">
                    <transport clientCredentialType="None" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="UserName" algorithmSuite="Default" />
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost:56662/WebSite2/Service.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService"
            contract="ServiceReference1.IService" name="BasicHttpBinding_IService" />
    </client>
    <behaviors>
        <serviceBehaviors>
            <behavior name="">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
于 2012-07-13T20:40:58.243 回答