【问题标题】:Configuring a WCF REST service as a client?将 WCF REST 服务配置为客户端?
【发布时间】:2014-09-15 14:57:38
【问题描述】:

是否可以让 WCF 服务也作为 Web 服务客户端执行?

如果可以,您能否提供一些关于如何在配置文件中配置客户端设置的指导?

我遇到的主要问题是我正在向我的主要 REST 服务发送大量消息。当该消息被中继到辅助服务时,似乎响应触发了“MaxReceivedMessage”过大错误。我尝试为我的 REST 服务配置 CLIENT 设置,但没有成功。

我在 app.config 或 web.config 中定义哪个配置?

看来我做错了,因为无论我在哪里声明客户端设置,绑定都会被忽略。

这是我的 REST 服务的 APPLICATION 配置。

<?xml version="1.0"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IBBIImageWarpService" />
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:8080/BBIImageWarp" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IBBIImageWarpService"
                contract="ServiceReference1.IBBIImageWarpService" name="BasicHttpBinding_IBBIImageWarpService" />
        </client>
    </system.serviceModel>
</configuration>

这是我的 REST 服务上失败的端点方法:

        public ServiceResponse<DataContracts.BBIImgObject> WarpImage(DataContracts.BBIImgObject imgObject)
        {
            try
            {

                writeMessage("converting to JSON");

                string JSON = new JavaScriptSerializer().Serialize(imgObject);

                BasicHttpBinding binding = new BasicHttpBinding();

//我应该把 MAXRECEIVEDMessageSize 添加到这个 BINDING 吗???

                EndpointAddress address = new EndpointAddress("http://localhost:8080/BBIImageWarp");

                ServiceReference1.BBIImageWarpServiceClient ImgWarpSvc = new ServiceReference1.BBIImageWarpServiceClient(binding, address);

                string rslt = ImgWarpSvc.WarpImageJSON(JSON);

                DataContracts.BBIImgObject cloneImgObject = new DataContracts.BBIImgObject();
                cloneImgObject.Base64EncodedImageData = rslt;
                cloneImgObject.BodyTypeID = imgObject.BodyTypeID;

                return new ServiceResponse<DataContracts.BBIImgObject>(String.Empty, ServiceResponse<DataContracts.BBIImgObject>.ResponseTypeEnum.BbiSuccess, cloneImgObject);
            }
            catch (Exception ex)
            {
                writeMessage(ex.Message);
                return new ServiceResponse<DataContracts.BBIImgObject>(ex.Message, ServiceResponse<DataContracts.BBIImgObject>.ResponseTypeEnum.BbiFailure, null);
            }
        }

【问题讨论】:

    标签: c# web-services wcf rest maxreceivedmessagesize


    【解决方案1】:

    您可以使用相同的二进制文件轻松创建客户端

    1. 将服务类的 DLL 包含到客户端项目中。
    2. 从您的服务接口创建一个通道工厂。
    3. 消费渠道工厂。

    根据您的要求了解更多信息,请查看http://msdn.microsoft.com/en-us/library/ms576132(v=vs.110).aspx

    对于最大接收错误,您需要执行以下操作: The max message size quota for incoming messages (65536) ....To increase the quota, use the MaxReceivedMessageSize property

    或者来自代码:

    WebHttpBinding binding = new WebHttpBinding();
    binding.MaxReceivedMessageSize = 2147483647;
    

    在客户端也是如此。

    【讨论】:

    • 感谢您的回复。对于#1 -> 我的 REST 服务在某种意义上就像一个客户端,它也调用一个单独的服务。该单独的服务是应用程序托管的......它是在运行时创建的。该服务没有DLL。对于 #2 -> 我如何获得对该服务接口的引用?我添加的唯一引用是对服务本身的引用。
    • 谢谢迪杰。 MaxReceivedMessageSize 是我的问题。我在帖子中添加了额外的代码。你介意回顾一下吗?它应该为我的问题提供更多背景信息。我添加了失败的调用
    • Dee Jay...这并没有 100% 解决我的问题,但您的回答绝对为我指明了正确的方向。感谢您的帮助。
    • @tronious 我很高兴它有帮助。我正在下班回家的路上,我会检查如何进一步帮助您。请告诉我你目前的处境?
    • Dee Jay,我实际上不再卡住了。就像我说的那样,您的回答帮助我到达了我需要的地方。该解决方案当然与 MaxReceivedMessageSize 属性有关。我只是没有将它设置在正确的位置。您的回答既帮助我找到了正确的位置,又帮助我更好地理解了我编写的现有代码(听起来很奇怪:))。再次感谢您花时间帮助我。干杯
    猜你喜欢
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 2011-07-01
    • 1970-01-01
    • 2012-04-08
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多