wcf - 如何在不使用 app.config 的情况下在 WCF 绑定(bind)中设置正确的内容类型?

标签 wcf wcf-binding dynamics-crm-2011

我已从测试控制台应用程序创建了对 CRM 2011 Organization.svc 的服务引用。 使用 app.config 中生成的绑定(bind)一切正常。(Microsoft 托管的服务示例 here。)

现在需要将其移至我们的“真实”应用程序中,并托管在将部署到 GAC 的 DLL 中。为了遵循应用程序的约定,绑定(bind)需要由代码生成

我开始尝试使用我们用于其他 WCF 服务的绑定(bind):

BasicHttpBinding binding = new BasicHttpBinding();
binding.SendTimeout = TimeSpan.FromMinutes(1);
binding.OpenTimeout = TimeSpan.FromMinutes(1);
binding.CloseTimeout = TimeSpan.FromMinutes(1);
binding.ReceiveTimeout = TimeSpan.FromMinutes(10);
binding.AllowCookies = true;
binding.BypassProxyOnLocal = false;
binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
binding.MessageEncoding = WSMessageEncoding.Text;
binding.TextEncoding = System.Text.Encoding.UTF8;
binding.TransferMode = TransferMode.Buffered;
binding.UseDefaultWebProxy = true;
binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;

不幸的是,在调用 WCF 服务时(使用带有 OrganizationRequest 的 Execute 方法),会发生此错误:

System.ServiceModel.ProtocolException: Content Type text/xml; charset=utf-8 was not supported by service http://server:5555/xrmservices/2011/organization.svc. The client and service bindings may be mismatched.

我不确定绑定(bind)的具体问题是什么,但到目前为止,我将其转换为代码的尝试失败了,并出现了相同的错误。这是 app.config 中定义的工作绑定(bind):

<bindings>
    <customBinding>
        <binding name="CustomBinding_IOrganizationService">
            <security defaultAlgorithmSuite="Default" authenticationMode="SspiNegotiated"
                requireDerivedKeys="true" securityHeaderLayout="Strict" includeTimestamp="true"
                keyEntropyMode="CombinedEntropy" messageProtectionOrder="SignBeforeEncryptAndEncryptSignature"
                messageSecurityVersion="WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10"
                requireSecurityContextCancellation="true" requireSignatureConfirmation="false">
                <localClientSettings cacheCookies="true" detectReplays="true"
                    replayCacheSize="900000" maxClockSkew="00:05:00" maxCookieCachingTime="Infinite"
                    replayWindow="00:05:00" sessionKeyRenewalInterval="10:00:00"
                    sessionKeyRolloverInterval="00:05:00" reconnectTransportOnFailure="true"
                    timestampValidityDuration="00:05:00" cookieRenewalThresholdPercentage="60" />
                <localServiceSettings detectReplays="true" issuedCookieLifetime="10:00:00"
                    maxStatefulNegotiations="128" replayCacheSize="900000" maxClockSkew="00:05:00"
                    negotiationTimeout="00:01:00" replayWindow="00:05:00" inactivityTimeout="00:02:00"
                    sessionKeyRenewalInterval="15:00:00" sessionKeyRolloverInterval="00:05:00"
                    reconnectTransportOnFailure="true" maxPendingSessions="128"
                    maxCachedCookies="1000" timestampValidityDuration="00:05:00" />
                <secureConversationBootstrap />
            </security>
            <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
                messageVersion="Default" writeEncoding="utf-8">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
            </textMessageEncoding>
            <httpTransport manualAddressing="false" maxBufferPoolSize="524288"
                maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Anonymous"
                bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                keepAliveEnabled="true" maxBufferSize="65536" proxyAuthenticationScheme="Anonymous"
                realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
                useDefaultWebProxy="true" />
        </binding>
    </customBinding>
</bindings>

有人知道如何在代码中设置正确的绑定(bind)和/或从 XML 读取绑定(bind)吗?

最佳答案

我刚刚有同样的任务需要解决。这对我有用(对于http)。

var security = SecurityBindingElement.CreateSspiNegotiationBindingElement();
security.DefaultAlgorithmSuite = SecurityAlgorithmSuite.Default;
security.SecurityHeaderLayout = SecurityHeaderLayout.Strict;
security.IncludeTimestamp = true;
security.KeyEntropyMode = SecurityKeyEntropyMode.CombinedEntropy;
security.MessageProtectionOrder = MessageProtectionOrder.SignBeforeEncryptAndEncryptSignature;
security.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10;

security.LocalClientSettings.CacheCookies = true;
security.LocalClientSettings.DetectReplays = true;
security.LocalClientSettings.ReplayCacheSize = 900000;
security.LocalClientSettings.MaxClockSkew = new TimeSpan(0, 5, 0);
security.LocalClientSettings.MaxCookieCachingTime = new TimeSpan(23, 0, 0, 0);
security.LocalClientSettings.ReplayWindow = new TimeSpan(0, 5, 0);
security.LocalClientSettings.SessionKeyRenewalInterval = new TimeSpan(15, 0, 0);
security.LocalClientSettings.SessionKeyRolloverInterval = new TimeSpan(0, 5, 0);
security.LocalClientSettings.ReconnectTransportOnFailure = true;
security.LocalClientSettings.TimestampValidityDuration = new TimeSpan(0, 5, 0);
security.LocalClientSettings.CookieRenewalThresholdPercentage = 60;

security.LocalServiceSettings.DetectReplays = true;
security.LocalServiceSettings.IssuedCookieLifetime = new TimeSpan(10, 0, 0);
security.LocalServiceSettings.MaxStatefulNegotiations = 128;
security.LocalServiceSettings.ReplayCacheSize = 900000;
security.LocalServiceSettings.MaxClockSkew = new TimeSpan(0, 5, 0);
security.LocalServiceSettings.NegotiationTimeout = new TimeSpan(0, 1, 0);
security.LocalServiceSettings.ReplayWindow = new TimeSpan(0, 5, 0);
security.LocalServiceSettings.InactivityTimeout = new TimeSpan(0, 2, 0);
security.LocalServiceSettings.SessionKeyRenewalInterval = new TimeSpan(15, 0, 0);
security.LocalServiceSettings.SessionKeyRolloverInterval = new TimeSpan(0, 5, 0);
security.LocalServiceSettings.ReconnectTransportOnFailure = true;
security.LocalServiceSettings.MaxPendingSessions = 128;
security.LocalServiceSettings.MaxCachedCookies = 1000;
security.LocalServiceSettings.TimestampValidityDuration = new TimeSpan(0, 5, 0);

var textEncoding = new TextMessageEncodingBindingElement
{
   MaxReadPoolSize = 64,
   MaxWritePoolSize = 16,
   MessageVersion = MessageVersion.Default,
   WriteEncoding = System.Text.Encoding.UTF8,
   ReaderQuotas = new XmlDictionaryReaderQuotas
   {
       MaxDepth = 32,
       MaxArrayLength = 16384,
       MaxBytesPerRead = 4096,
       MaxNameTableCharCount = 16384,
       MaxStringContentLength = 8192
   }
};

var httpTransport = new HttpTransportBindingElement
{
    ManualAddressing = false,
    MaxBufferSize = 65536,
    MaxReceivedMessageSize = 65536,
    AllowCookies = false,
    AuthenticationScheme = AuthenticationSchemes.Anonymous,
    BypassProxyOnLocal = false,
    DecompressionEnabled = true,
    HostNameComparisonMode = HostNameComparisonMode.StrongWildcard,
    KeepAliveEnabled = true,
    MaxBufferPoolSize = 524288,
    ProxyAuthenticationScheme = AuthenticationSchemes.Anonymous,
    TransferMode = TransferMode.Buffered,
    UnsafeConnectionNtlmAuthentication = false,
    UseDefaultWebProxy = true,
};

var binding = new CustomBinding(new List<BindingElement> { security, textEncoding, httpTransport });
var endpoint = new EndpointAddress(_serviceUri);

var service = new OrganizationServiceClient(binding, endpoint);

关于wcf - 如何在不使用 app.config 的情况下在 WCF 绑定(bind)中设置正确的内容类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7523842/

相关文章:

asp.net - 如何在 asp.net 中创建 RESTful web 服务?

c# - 使用 SSON cookie 的具有 HTTPS 安全性的 WCF 连接

c# - 在 C# 中引发异常时调用服务的析构函数

wcf - 元数据包含无法为 iis 托管的 wcf 服务解析的引用

.net - 帮助选择绑定(bind)(WCF)

dynamics-crm-2011 - 为什么我的 CRM Web 资源中的 javascript 中的 Xrm.Page.Data 始终等于 null?

c# - 将接口(interface)方法作为参数传递

.net - 如何获取 WCF 远程端点的 IP 地址?

sql - 动态 SQL - 从临时表中选取值

javascript - 在 MS CRM 2013 中将字段设置为只读