我有WebGet和WebInvoke属性描述我的合同,但什么是处理无效的URI的最好方法是什么? 现在,如果用户传递一个URI不符合我目前的操作,他们得到一个“端点没有找到。” 信息。 我想传回一个更具描述性的消息。
例如,我的URI模板的样子:
/Stuff/{ID}/subStuff
但说他们键入
/Stuff/{ID}/OtherStuff
这里是OtherStuff没有这样的事情,和我没有为一个模板。
有没有办法覆盖映射URI与一个合同的所有非?
谢谢!
我有WebGet和WebInvoke属性描述我的合同,但什么是处理无效的URI的最好方法是什么? 现在,如果用户传递一个URI不符合我目前的操作,他们得到一个“端点没有找到。” 信息。 我想传回一个更具描述性的消息。
例如,我的URI模板的样子:
/Stuff/{ID}/subStuff
但说他们键入
/Stuff/{ID}/OtherStuff
这里是OtherStuff没有这样的事情,和我没有为一个模板。
有没有办法覆盖映射URI与一个合同的所有非?
谢谢!
如果你想赶上在WCF REST全球范围内的所有未处理的请求,那么你必须创建一个自定义WebHttpBehavior
和自定义IOperationInvoker
的描述,在此职位 。
如果你想用自定义状态码(404)返回一个自定义错误文本你也可以看看到WebOperationContext.OutgoingResponse
属性作为描述在这里 。
虽然我没有按照链接标记提供,他们的确给我需要的一个暗示。 有联系,答案实际上并没有回答我原来的问题。
我可以遵循的步骤,我想我列出的措施来解决这个问题,这个问题也是如此。
要创建我自己,这不是映射到我的合同,我创建了以下的方法任何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”可序列化,它的序列化表示形式将被发送回客户端。