Старый вопрос, но так как никто не упомянул это, я добавлю это из Поваренной книги Python:
Рецепт 81252: Используя dtuple для Гибкого Доступа Результата запроса
Этот рецепт специально предназначен для контакта с результатами базы данных, и dtuple решение позволяет Вам получать доступ к результатам по имени ИЛИ индексу. Это избегает необходимости получать доступ ко всему нижним индексом, который очень трудно поддержать, как отмечено в Вашем вопросе.
Я хочу защитить некоторую конечную точку Служба WCF, я не знаю, можете ли вы защитить некоторые конечные точки, а некоторые нет.
Конечно - вам просто нужно создать две отдельные конфигурации привязки и использовать одну на тех конечных точках, которые защищены, а другую - на других:
<bindings>
<basicHttpBinding>
<binding name="secured">
<security mode="Message">
<message ...... />
</security>
</binding>
<binding name="unsecured">
<security mode="None" />
</binding>
</basicHttpBinding>
</bindings>
<services>
<service name="WindowsFormsApplication11.WmsStatService" behaviorConfiguration="mex">
<host>
<baseAddresses>
<add baseAddress="http://192.168.0.199:87" />
</baseAddresses>
</host>
<endpoint address="/Secured/Test"
binding="basicHttpBinding" bindingConfiguration="secured"
contract="WindowsFormsApplication11.IWmsStat"
behaviorConfiguration="MyServiceBehavior" />
<endpoint address="/Unsecured/Test"
binding="basicHttpBinding" bindingConfiguration="unsecured"
contract="WindowsFormsApplication11.IWmsStat"
behaviorConfiguration="MyServiceBehavior" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
Марк
PS: не уверен, что это просто проблема с тем, что ваши сообщения больше не обновляются - вы заметили, что у вас есть две отдельные конфигурации поведения:
<behaviors>
<serviceBehaviors>
<behavior name="mex">
<serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
</behavior>
<behavior name="MyServiceBehavior">
<serviceCredentials>
<userNameAuthentication
userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="WindowsFormsApplication11.CustomValidator, CustomValidator" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
и ваша служба ссылается только на поведение "mex"? Это означает, что ваша служба действительно использует поведение
, но НЕ
один!
Вам необходимо объединить их в один а затем укажите только это:
<behaviors>
<serviceBehaviors>
<behavior name="Default">
<serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
<serviceCredentials>
<userNameAuthentication
userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="WindowsFormsApplication11.CustomValidator, CustomValidator" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="...." behaviorConfiguration="Default"
Марк
Если вы хотите защитить сообщение целиком, можно использовать режим безопасности транспорта. Если вы хотите, чтобы были зашифрованы / подписаны только ваши заголовки, режим безопасности сообщений позволяет это, но вам придется использовать wsHttpBinding. Вы также можете рассмотреть возможность использования Дайджеста для защиты учетных данных.
Что касается вашего примера, я думаю, что ваша комментируемая часть должна выглядеть так:
<bindings>
<basicHttpBinding>
<binding name="secure">
<security mode="Transport">
<transport clientCredentialType="Basic" />
</security>
</binding>
</basicHttpBinding>
</bindings>
Вам также придется обновить объявление конечной точки:
<endpoint
address="https://192.168.0.199:87/Test"
binding="basicHttpBinding" bindingConfiguration="secure"
contract="WindowsFormsApplication11.IWmsStat" />
Вы не будете разрешено использовать обычный HTTP с транспортным режимом безопасности.