【问题标题】:Handling Invalid URI passed to a WCF service处理传递给 WCF 服务的无效 URI
【发布时间】:2012-06-25 16:31:41
【问题描述】:

我有 WebGet 和 WebInvoke 属性来描述我的合同,但处理无效 URI 的最佳方法是什么?现在,如果用户传递的 URI 与我当前的操作不匹配,他们会得到“找不到端点”。信息。我想回传一条更具描述性的消息。

例如,我的 URI 模板如下所示:

/Stuff/{ID}/subStuff

但说他们打字

/Stuff/{ID}/OtherStuff

没有其他东西这样的东西,我也没有模板。

有没有办法用一个合同覆盖所有非映射的 URI?

谢谢!

【问题讨论】:

    标签: wcf rest


    【解决方案1】:

    如果您想在 WCF REST 的全局级别捕获所有未处理的请求,那么您必须创建自定义 WebHttpBehavior 和自定义 IOperationInvoker,如 post 中所述。

    如果您想返回带有自定义状态代码 (404) 的自定义错误文本,您还可以查看 WebOperationContext.OutgoingResponse 属性,如 here 所述。

    【讨论】:

    • 谢谢,我试试看!
    • 好的,这两种技术我都试过了。两者都不起作用,因为我依靠 IIS 来提供端点。在创建服务时,端点不存在,所以我无法绑定行为。
    【解决方案2】:

    虽然我确实按照提供的链接标记进行操作,但它们确实暗示了我需要什么。链接的答案实际上并没有回答我原来的问题。

    我能够按照这些步骤进行操作,并且我也想列出解决此问题的步骤。

    为了创建我自己对未映射到合同中方法的任何 URI 的响应,我创建了以下内容:

    • 自定义 ServiceHostFactory
    • 我在自定义 ServiceHostFactory 中映射到我的端点的行为
    • 一个调度程序,它将处理提供给服务的所有未映射的 uri。

    以下是我创建的对象的完整定义:

    using System.ServiceModel;
    using System.ServiceModel.Activation;
    
    namespace your.namespace.here
    {
        public class CustomServiceHostFactory : WebServiceHostFactory
        {
            protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
            {
                ServiceHost host = base.CreateServiceHost(serviceType, baseAddresses);
                //note: these endpoints will not exist yet, if you are relying on the svc system to generate your endpoints for you
                // calling host.AddDefaultEndpoints provides you the endpoints you need to add the behavior we need.
                var endpoints = host.AddDefaultEndpoints();
                foreach (var endpoint in endpoints)
                {
                    endpoint.Behaviors.Add(new WcfUnkownUriBehavior());
                }
    
                return host;
            }
        }
    }
    

    正如您在上面看到的,我们正在添加一个新行为:WcfUnknownUriBehavior。这个新的自定义行为的核心职责是替换 UnknownDispatcher。下面是那个实现:

    using System.ServiceModel.Dispatcher;
    using System.ServiceModel.Channels;
    using System.ServiceModel.Web;
    namespace your.namespace.here
    {
        public class UnknownUriDispatcher : IOperationInvoker
        {
            public object[] AllocateInputs()
            {
                //no inputs are really going to come in,
                //but we want to provide an array anyways
                return new object[1]; 
            }
    
            public object Invoke(object instance, object[] inputs, out object[] outputs)
            {
                var responeObject = new YourResponseObject()
                {
                    Message = "Invalid Uri",
                    Code = "Error",
                };
                Message result = Message.CreateMessage(MessageVersion.None, null, responeObject);
                WebOperationContext.Current.OutgoingResponse.ContentType = "text/html";
                outputs = new object[1]{responeObject};
                return result;
            }
    
            public System.IAsyncResult InvokeBegin(object instance, object[] inputs, System.AsyncCallback callback, object state)
            {
                throw new System.NotImplementedException();
            }
    
            public object InvokeEnd(object instance, out object[] outputs, System.IAsyncResult result)
            {
                throw new System.NotImplementedException();
            }
    
            public bool IsSynchronous
            {
                get { return true; }
            }
        }
    }
    

    一旦您指定了这些对象,您现在可以在您的 svc 的“标记”中使用新工厂:

    <%@ ServiceHost Language="C#" Debug="true" Service="your.service.namespace.here" CodeBehind="myservice.svc.cs"
                    Factory="your.namespace.here.CustomServiceHostFactory" %>
    

    应该就是这样。只要您的对象“YourResponseObject”可以被序列化,它的序列化表示就会被发送回客户端。

    【讨论】:

    • 请问 WcfUnknownUriBehavior 的定义在哪里?
    • 它是我在上面的问题中写的自定义类
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    相关资源
    最近更新 更多