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. 擴展通過約定Ninject綁定
- 3. 如何通過代碼添加綁定列到gridview?
- 4. 通過htaccess添加文件擴展名
- 5. 通過擴展添加可變性
- 6. 擴展AspNetUsers通過添加一個額外的模型 - 代碼第一
- 7. 如何將自定義擴展標籤添加到GPXFramework代碼?
- 8. 通過擴展向ActiveRecord模塊添加自定義驗證?
- 9. 通過代碼添加窗體控件通過代碼
- 10. 通過擴展
- 11. VS代碼擴展 - 編程鍵綁定找到
- 12. 如何獲取Visual Studio代碼擴展中的鍵綁定?
- 13. 擴展postgresql代碼
- 14. 如何在Visual Studio代碼中使用vim(鍵綁定)代碼vim擴展
- 15. 通過綁定隱藏WPF擴展器上的ToggleButton
- 16. 通過綁定屬性設置Visiblity後,網格行不擴展
- 17. Chrome擴展:解除綁定事件監聽器通過對飛
- 18. 通過代碼添加xml標記
- 19. Android通過代碼添加許多Imageview
- 20. 通過代碼不工作添加LongListSelector
- 21. Windows 8通過代碼添加附件
- 22. 代碼問題通過nuget添加ELMAH
- 23. Javascript通過代碼添加js庫
- 24. Android:通過java代碼添加圖像
- 25. 添加通過代碼參考?
- 26. 動態添加HTML代碼通過JavaScript
- 27. 通過ASPX代碼添加CSS類
- 28. 如何通過添加Python代碼
- 29. 事件通過代碼添加不開
- 30. 通過代碼在Sharepoint中添加TermSetGroup
我應該說明我正在使用WebServiceHostFactory,所以綁定代碼對我來說是不可用的,儘管我可能能夠將其綁定到子類並掛鉤它。 – FlySwat 2010-04-06 02:46:39
我認爲你最簡單的方法是繼承並鉤入它......見上面.. – Nix 2010-04-06 12:07:19
這不適用於WebServiceHost,因爲它自動查找端點並創建它自己的綁定。您不能在CreateServiceHost中創建一個綁定。 – FlySwat 2010-04-06 17:10:42