2003 年使用 POST / JSON 托管 WCF Rest 服务

Posted

技术标签:

【中文标题】2003 年使用 POST / JSON 托管 WCF Rest 服务【英文标题】:WCF Rest Service Hosting on 2003 With POST / JSON 【发布时间】:2011-07-19 14:58:41 【问题描述】:

当我在 Win 2003 服务器上托管 WCF 服务时遇到问题。 因为它在我的本地 PC 上运行良好。

如果我需要对 Web Config 进行任何更改,请立即通知我。文件。一样的。

“/”应用程序中的服务器错误。 IIS 指定身份验证方案“IntegratedWindowsAuthentication, Anonymous”,但绑定仅支持指定一个身份验证方案。有效的身份验证方案是 Digest、Negotiate、NTLM、Basic 或 Anonymous。更改 IIS 设置,以便只使用一个身份验证方案。 说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.InvalidOperationException:IIS 指定身份验证方案“IntegratedWindowsAuthentication, Anonymous”,但绑定仅支持指定一种身份验证方案。有效的身份验证方案是 Digest、Negotiate、NTLM、Basic 或 Anonymous。更改 IIS 设置,以便只使用一个身份验证方案。

来源错误:

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常来源和位置的信息。

堆栈跟踪:

[InvalidOperationException: IIS specified authentication schemes 'IntegratedWindowsAuthentication, Anonymous', but the binding only supports specification of exactly one authentication scheme. Valid authentication schemes are Digest, Negotiate, NTLM, Basic, or Anonymous. Change the IIS settings so that only a single authentication scheme is used.]
   System.ServiceModel.Web.WebServiceHost.SetBindingCredentialBasedOnHostedEnvironment(ServiceEndpoint serviceEndpoint, AuthenticationSchemes supportedSchemes) +446264
   System.ServiceModel.Web.WebServiceHost.AddAutomaticWebHttpBindingEndpoints(ServiceHost host, IDictionary`2 implementedContracts, String multipleContractsErrorMessage) +709
   System.ServiceModel.Web.WebServiceHost.OnOpening() +203
   Microsoft.ServiceModel.Web.WebServiceHost2.OnOpening() in e:\bt\3781\Microsoft.ServiceModel.Web\Microsoft.ServiceModel.Web\WebServiceHost2.cs:69
   System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +229
   System.ServiceModel.HostingManager.ActivateService(String normalizedVirtualPath) +121
   System.ServiceModel.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath) +479

[ServiceActivationException: The service '/Service.svc' cannot be activated due to an exception during compilation.  The exception message is: IIS specified authentication schemes 'IntegratedWindowsAuthentication, Anonymous', but the binding only supports specification of exactly one authentication scheme. Valid authentication schemes are Digest, Negotiate, NTLM, Basic, or Anonymous. Change the IIS settings so that only a single authentication scheme is used..]
   System.ServiceModel.AsyncResult.End(IAsyncResult result) +11599786
   System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result) +194
   System.ServiceModel.Activation.HostedHttpRequestAsyncResult.ExecuteSynchronous(HttpApplication context, Boolean flowContext) +176
   System.ServiceModel.Activation.HttpModule.ProcessRequest(Object sender, EventArgs e) +278
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +68
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75


Version Information: Microsoft .NET Framework Version:2.0.50727.3615; ASP.NET Version:2.0.50727.3618 

【问题讨论】:

检查web.config中的绑定配置你是使用basichttp还是wshttp绑定? 【参考方案1】:

有一个快速修复,一个正确的修复。

快速修复:

在 IIS 中,转到运行服务的 Web 应用程序的属性,转到“目录安全”选项卡,然后在“身份验证和访问控制”组中,按“编辑...”。删除您不需要的任何身份验证方案。确定所有对话框,然后执行 IIS 重置。

正确修复:

确保您的服务配置为使用显式端点。我发现使用 webHttpBinding 的开箱即用绑定,并将端点配置为使用 webHttp 行为是诀窍。

如果您不指定端点,WebserviceHost 将尝试猜测您想要什么,并且总是选择错误的。

在您的 web.config 中,您应该有类似的内容:

<system.serviceModel>
  <services>
    <service behaviourConfiguration="MyRestService.Behavior" 
             name="MyRestService>
      <endpoint address="" binding="webHttpBinding" contract="IMyRestService"
                behaviourConfiguration="MyRestService.WebHttpEndpointBehavior" />
    </service>
  </services>
  <bindings>
  </bindings>
  <behaviours>
    <serviceBehaviors>
      <behavior name="MyRestService.Behavior">
        <!-- Any configuration for the service, i.e. serviceDebug, etc. -->
      </behavior>
    </serviceBehaviors>
    <endpointBehaviors>
      <behavior name="MyRestService.WebHttpEndpointBehavior">
        <webHttp />
      </behavior>
    </endpointBehaviors>
  </behaviours>
</system.serviceModel>

当然,这样的配置设置使我能够在安装了 .NET 3.5 SP1 的 Win2k3 服务器上运行 WCF REST 服务。

【讨论】:

以上是关于2003 年使用 POST / JSON 托管 WCF Rest 服务的主要内容,如果未能解决你的问题,请参考以下文章

Access 2003 的托管代码插件

jQuery的POST请求返回JSON返回集合遍历方法

在 POST JSON RestKit 中检索 null

用于 html、json 和 websockets 的自托管 Web 服务器所需的方向

Python:如何将 HTTP POST 转换为 JSON 格式

将托管 C++ 从 vs2003 移植到 vs2008 的问题