2010-12-03 10 views
2

"ドロップイン" Webサービスを作成することはできますか?私がしたいのは、.svcファイルを作成して、IIS上のWebディレクトリに置くことができ、他のファイルをインストールしたり、設定ファイルを変更したりせずに、URL経由でアクセス(および実行)することができます。.svcファイルに完全に含まれるASP.NET Webサービスを作成することは可能ですか?

私は、.svcファイルをアップロードできるWebアプリケーションのセキュリティ上の問題を調査しています。 .svcファイルをアップロードして実行することができれば、このアプリケーションにとって大きなセキュリティ上の問題になります。残念ながら、私は.NET開発者ではないので、おそらくここでは多くのことがありません。

"サービスホスト"指令の後にサービスインターフェイスと実装を.svcファイルに直接入れることが可能であることは知っています。サービス「EchoServiceは」ゼロのアプリケーション(非インフラストラクチャ)のエンドポイントを持っている:私は、私は、.NETからの例外を取得http://localhost/test1.svcにアクセスする際

<%@ ServiceHost Language = "C#" Debug = "true" Service = "EchoService" %> 
public interface IEchoService 
{ 
    string Hello(); 
} 

public class EchoService : IEchoService 
{ 
    public string Hello() 
    { 
     return "Hello"; 
    } 
} 

:今ここに私の.SVCファイルです。これは、アプリケーションに設定ファイルが見つからなかったか、またはサービス名に一致するサービス要素が構成ファイルに見つからないか、またはサービス要素にエンドポイントが定義されていないことが原因です。

通常、web.configファイルまたはapp.configファイルでWebサービスのエンドポイントを設定することになっていることを理解しています。いくつかのグーグルでは、独自のServiceHostとServiceCodeFactoryを定義してプログラムでエンドポイントを設定できることも学びました。私はいくつかの例を見つけましたが、それらを働かせることはできませんでした。

実行可能なサービスを得るために、上記の例に必要なコードを追加する方法を示す、または「実行しようとしていることは不可能です」と誰かが私に言うことができたら本当に感謝します。

更新:ジョシュの提案を使用して、私はついにそれを動作させました。作業コードについては、私の答えを参照してください。

+0

答えには関係ありませんが、あなた自身を守るためにできることがいくつかあります。すべてのアップロードを、スクリプトや実行可能ファイルが実行されないディレクトリ(IIS設定)に置くことができます。また、アップロードコードを変更してsvcなどの危険な拡張機能を除外することもできます。 – Josh

答えて

1

さて、.svcファイルに含まれているSOAP Webサービスが動作しています。ここにコードです:

<%@ ServiceHost 
    Language = "C#" 
    Debug = "true" 
    Factory="Hello.CustomServiceHostFactory" 
    Service = "Hello.HelloService" %> 

using System; 
using System.ServiceModel; 
using System.ServiceModel.Activation; 

namespace Hello 
{ 

    public class CustomServiceHostFactory : ServiceHostFactory 
    { 

    public override System.ServiceModel.ServiceHostBase CreateServiceHost(string constructorString, Uri[] baseAddresses) 
    { 
     return base.CreateServiceHost(constructorString, baseAddresses); 
    } 

     protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
     { 
     CustomHost host = new CustomHost(serviceType, baseAddresses); 

      //configure customServiceHost here 

     host.AddServiceEndpoint(typeof(IHelloService), new BasicHttpBinding(), ""); 

      var smb = host.Description.Behaviors.Find <System.ServiceModel.Description.ServiceMetadataBehavior>(); 
      if(smb == null) 
      { 
      // add the "get metadata" behavior 
      // This will allow the service to emit WSDL when tickled at the right HTTP endpoint 
      smb= new System.ServiceModel.Description.ServiceMetadataBehavior(); 
      smb.HttpGetEnabled = true; 
      host.Description.Behaviors.Add(smb); 
      }  
       return host; 
     } 
    } 

public class CustomHost : ServiceHost 
{ 

    public CustomHost() 
    { 
    } 

    public CustomHost(Type serviceType, params Uri[] baseAddresses) 
    : base(serviceType, baseAddresses) 
    { 
    } 


    public CustomHost(object singeltonInstance, params Uri[] baseAddresses) 
     : base(singeltonInstance, baseAddresses) 
{ 
} 

    protected override void ApplyConfiguration() 
    { 
    base.ApplyConfiguration(); 
    } 
} 

[ServiceContract(Namespace="http://www.example.com")] 
public interface IHelloService 
{ 
[OperationContract] 
    string Hello(); 
} 

public class HelloService : IHelloService 
{ 
    public string Hello() { 
     return "Hello"; 
    } 
} 
} 

これは、以前のバージョンについてはわかりません。

0

私は自分でこれをやったことはありませんが、解決策はServiceHostです。 (自分で試すことなく)ServiceHostは、カスタムサービスホストを使用して公開されたメソッドによってプログラムで設定できます。

http://msdn.microsoft.com/en-us/library/bb332338.aspx

IIS

へのアクセスのServiceHostまでスクロールダウンリスト5-6。 CustomServiceHostFactoryを持つ.svcファイル

<% @ServiceHost Language="C#" Debug="true" 
Service="QuickReturns.StockTrading.ExchangeService.TradeService" 
Factory="QuickReturns.StockTrading.ExchangeService. 
TradeServiceCustomHostFactory" %> 

リスト5-7。 TradeServiceCustomHostFactoryとTradeServiceCustomHost

using System; 
using System.ServiceModel; 
using System.ServiceModel.Activation; 

namespace QuickReturns.StockTrading.ExchangeService 
{ 
    public class TradeServiceCustomHostFactory : ServiceHostFactory 
    { 
     protected override ServiceHost CreateServiceHost(
     Type serviceType, Uri[] baseAddresses) 
     { 
     TradeServiceCustomHost customServiceHost = 
      new TradeServiceCustomHost(serviceType, baseAddresses); 

     //configure customServiceHost here 

     return customServiceHost; 
     } 
    } 

    public class TradeServiceCustomHost : ServiceHost 
    { 
     public TradeServiceCustomHost(Type serviceType, params Uri[] 
baseAddresses) 
     : base(serviceType, baseAddresses) 
     { 
      //or configure here 
     } 

     protected override void ApplyConfiguration() 
     { 
     base.ApplyConfiguration(); 
     } 
    } 
} 

あなたは1つのSVCにそのすべてをドロップすることができるかもしれません。

+0

ありがとう、私はあなたの助けに感謝します。私はこのようなことを試みました - 質問の更新を見てください、しかし私はまだ固まっていますが、別の例外があります。 – Alla