4

ワーカーロール内でAzure上で外部向けのWCFサービスをホストしようとしています。

ローカルで非常にうまく機能するソリューションがありますが、Azureに公開しようとすると、初期化/ビジー/停止ループに入ります。

私がインターネットで見つけた情報は、さまざまなことを言っています。

http://www.theworkflowelement.com/2011/01/worker-role-service-hosting-faq.html(不可能)

http://code.msdn.microsoft.com/WCF-Azure-Worker-Role-on-b394df49(ハックの可能性あり)

他の情報源はそれが可能であると言っていますが、私には2つ以上のリンクを投稿する担当者がいません。

最後の1つは、公開しようとすると忙しくなります。

誰もがこれを行う方法を知っていますか、それとも本当に不可能ですか?ワーカーロールでホストすると非常に便利なので、Webロールに伴うsvcおよびweb.configの混乱を使用する必要はありません。

これは私が使用しているコードです:

    [ServiceContract(Namespace = "")]
    public interface IMyService
    {
        [OperationContract]
        [WebGet]
        string Echo(string s);
    }

    public class MyService : IMyService
    {
        public string Echo(string s)
        {
            return "hey " + s;
        }
    }

    public class TestPasswordValidator : UserNamePasswordValidator
    {
        public override void Validate(string userName, string password)
        {
        }
    }

    private static void StartService()
    {
        var endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["HttpsEndpoint"];
        var uri = new Uri(endpoint.Protocol + "://" + endpoint.IPEndpoint + "/myservice");
        var host = new ServiceHost(typeof(MyService), uri);

        host.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = UserNamePasswordValidationMode.Custom;
        host.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new TestPasswordValidator();

        var mexBehavior = new ServiceMetadataBehavior();
        mexBehavior.HttpsGetEnabled = true;
        mexBehavior.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
        host.Description.Behaviors.Add(mexBehavior);

        var soapBinding = new WSHttpBinding(SecurityMode.TransportWithMessageCredential);
        soapBinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;

        host.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpsBinding(), "mex");
        host.AddServiceEndpoint(typeof(IMyService), soapBinding, "Soap");

        var restBinding = new WebHttpBinding(WebHttpSecurityMode.Transport);
        restBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;

        var restEndpoint = host.AddServiceEndpoint(typeof(IMyService), restBinding, "");
        restEndpoint.Behaviors.Add(new WebHttpBehavior { HelpEnabled = true, DefaultOutgoingResponseFormat = WebMessageFormat.Json, AutomaticFormatSelectionEnabled = true, DefaultBodyStyle = WebMessageBodyStyle.WrappedRequest });

        host.Open();
    }

    public override void Run()
    {
        StartService();

        while (true)
        {
            Thread.Sleep(10000);
        }
    }

    public override bool OnStart()
    {
        // Set the maximum number of concurrent connections 
        ServicePointManager.DefaultConnectionLimit = 12;

        // For information on handling configuration changes
        // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.

        return base.OnStart();
    }
4

1 に答える 1

10

なぜこれが起こっているのか分かりました。Worker ロールは、HTTP ポートを開くために昇格されたアクセス許可で実行する必要があります。ただし、この設定は役割設定 GUI では使用できません。アクセス許可を制御していると思われるGUIの設定は、完全な信頼/部分的な信頼です。私はそれが何をするのか分からないと思います。

正しい設定は、WorkerRole の下の ServiceDefinition.csdef ファイルにあります。

<Runtime executionContext="elevated" />
于 2011-03-04T12:41:38.530 に答える