1
A
回答
0
所以我想通了,我只好先子WebServiceHostFactory:
/// <summary>
/// RestServiceFactory extends WebServiceHostFactory and adds support for JSONP encoding
/// </summary>
public class RestServiceFactory : WebServiceHostFactory
{
/// <summary>
/// Creates a ServiceHost using the first address in baseAddresses
/// </summary>
/// <param name="serviceType"></param>
/// <param name="baseAddresses"></param>
/// <returns></returns>
protected override System.ServiceModel.ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
Uri[] defaultAddresses = new Uri[1];
defaultAddresses[0] = baseAddresses[0];
ServiceHost host = new RestServiceHost(serviceType, defaultAddresses);
// Bind up the JSONP extension
CustomBinding cb = new CustomBinding(new WebHttpBinding());
cb.Name = "JSONPBinding";
// Replace the current MessageEncodingBindingElement with the JSONP element
var currentEncoder = cb.Elements.Find<MessageEncodingBindingElement>();
if (currentEncoder != default(MessageEncodingBindingElement))
{
cb.Elements.Remove(currentEncoder);
cb.Elements.Insert(0, new JSONP.JSONPBindingElement());
}
host.AddServiceEndpoint(serviceType.GetInterfaces()[0], cb, defaultAddresses[0]);
return host;
}
}
然后我不得不继承WebServiceHost修改它是如何设置的行为:
/// <summary>
/// RestServiceHost extends WebServiceHost to add JSONP support
/// </summary>
public class RestServiceHost : WebServiceHost
{
public RestServiceHost() : base() { }
public RestServiceHost(Type serviceType, params Uri[] baseAddresses) : base(serviceType,baseAddresses) { }
protected override void OnOpening()
{
base.OnOpening();
if (base.Description != null)
{
foreach (ServiceEndpoint endpoint in base.Description.Endpoints)
{
if ((endpoint.Binding != null) && (endpoint.Binding.CreateBindingElements().Find<JSONP.JSONPBindingElement>() != null))
{
if (endpoint.Behaviors.Find<WebHttpBehavior>() == null)
{
endpoint.Behaviors.Add(new WebHttpBehavior());
}
}
}
}
}
}
此更改的原因是因为WebServiceHost由于自定义绑定而未添加任何行为。
完成这两个更改后,通过正确的绑定扩展传送请求,不需要更改web.config。
3
如果你给我更多的上下文,我可以使用你的代码片段重写。只要让我知道你的绑定扩展的名字....
如果您需要使用WebServiceHostFactory
public class ServiceHostFactory : WebServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
ServiceHost serviceHost = new ServiceHost(typeof(IService));
CustomBinding customBinding= new CustomBinding();
customBinding.Name = “myCustomBinding”;
customBinding.Elements.Add(new SomeBindingExtensionElement());
serviceHost.AddServiceEndpoint(typeof(IService), customBinding,
“http://localhost/service/CustomEndpoint”);
相关问题
- 1. Visual Studio代码扩展如何直接添加键绑定
- 2. 通过htaccess添加文件扩展名
- 3. 扩展AspNetUsers通过添加一个额外的模型 - 代码第一
- 4. 通过扩展向ActiveRecord模块添加自定义验证?
- 5. 通过代码添加窗体控件通过代码
- 6. 通过扩展
- 7. 如何获取Visual Studio代码扩展中的键绑定?
- 8. VS代码扩展 - 编程键绑定找到
- 9. 扩展postgresql代码
- 10. 通过绑定属性设置Visiblity后,网格行不扩展
- 11. 添加通过代码参考?
- 12. 通过代码添加谷歌帐户
- 13. 通过代码在Sharepoint中添加TermSetGroup
- 14. 通过代码添加模块
- 15. 通过代码添加xml标记
- 16. 如何在Visual Studio代码中使用vim(键绑定)代码vim扩展
- 17. vs代码 - 回滚扩展/安装特定扩展版本
- 18. 如何修改代码,在此扩展通过cron
- 19. 通过Visual Studio代码扩展注入隐式环境类型
- 20. 通过java代码找到文件扩展名
- 21. 如何通过代码连接到桌面扩展坞
- 22. 通过代码扩展内容查询Web部件
- 23. WPF扩展器IsExpanded绑定
- 24. 通过C API加载内核扩展?
- 25. VS2010扩展 - 代码定义窗口
- 26. 如何在Chrome扩展中添加AdSense代码?
- 27. 扩展Python的代码 - 添加语言功能
- 28. 如何将javascript代码添加到safari扩展?
- 29. 在Git扩展中添加.cu和.cuh作为'c'代码
- 30. Visual Studio扩展:向代码编辑器添加元素ContextMenu
我应该说明我正在使用WebServiceHostFactory,所以绑定代码对我来说是不可用的,尽管我可能能够将其绑定到子类并挂钩它。 – FlySwat 2010-04-06 02:46:39
我认为你最简单的方法是继承并钩入它......见上面.. – Nix 2010-04-06 12:07:19
这不适用于WebServiceHost,因为它自动查找端点并创建它自己的绑定。您不能在CreateServiceHost中创建一个绑定。 – FlySwat 2010-04-06 17:10:42