1

我想将我的 WCF 服务从 WebSite App_Code 文件夹迁移到项目库。据我所知,WCF 库能够读取有关服务模型的 Web 配置,所以我所做的唯一操作是: 1 - 创建新项目库并将有关 wcf 的所有代码从 app_code 放入其中。2 - 修改 web 配置以指向具有完整限定名称(命名空间 + 类名称)的服务类 3 - 修改 svc 文件以指向具有完整限定名称的服务类实例。

但是,我的服务不再运行。我正在使用带有自定义验证器的 ws-httpbinding,但似乎我的服务需要一个基本的 http 绑定。我正在努力解决的错误如下所示:消息的请求必须受到保护,例如合同操作('IMyService',' http ://tempuri.org/' )所要求的。必须通过 ('BasicHttpBinding',' http://tempuri.org/ ') 绑定来实现保护。

@@编辑:

我的网络配置:

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceCredentials>
            <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="MyWcfNamespaceOfMyDLL.MyCustomValidator" />
            <serviceCertificate findValue="localhost" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="My" />
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <wsHttpBinding>
        <binding name="MyBinding" maxBufferPoolSize="1000000000" maxReceivedMessageSize="1000000000" messageEncoding="Mtom">
          <security mode="Message">
            <message clientCredentialType="UserName" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="MyBehavior" name="MyServiceName">
        <endpoint address="" binding="wsHttpBinding" contract="MyWcfNamespaceOfMyDLL.IMyServiceName" bindingConfiguration="MyBinding">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
</configuration>

这是我在网站根目录中的 svc 文件:

<%@ ServiceHost Language="C#" Debug="true" Service="MyWcfNamespaceOfMyDLL.MyServiceName" %>

最后,我的 dll 中的服务合同如下所示:

[ServiceContract]
public interface IMyService
{
    [OperationContract(ProtectionLevel=System.Net.Security.ProtectionLevel.EncryptAndSign)]
    string DoSomething();
}

public class MyServiceName : IMyService
{
   public string DoSomething();
}

public class MyValidator : UserNamePasswordValidator
    {
// simple validation
}

任何想法?

4

2 回答 2

1

我已经解决了。问题在于网络配置中缺少 dll 名称。

我不得不改变我的配置如下:

第一的:

<userNameAuthentication userNamePasswordValidationMode="Custom" 
      customUserNamePasswordValidatorType="="MyWcfNamespaceOfMyDLL.MyCustomValidator", MyDllName" />

第二:

<services>
      <service behaviorConfiguration="MyBehavior" 
               name="MyWcfNamespaceOfMyDLL.MyServiceName">
        <endpoint address="" binding="wsHttpBinding"
                  contract="IMyServiceName" bindingConfiguration="MyBinding">
          <identity>

我想每个人都可以开始疯狂..!!

好吧,如您所见,我必须:

  • 在 userNameAuthentication 标记上指定 DLL 名称。
  • 在服务标签的属性名称上指定命名空间名称。
  • 删除端点标签的合约属性上有关命名空间名称的规范。

好的我已经解决了,但我有点担心下一个未来..!!

于 2013-05-30T19:40:00.300 回答
0

您确定问题来自服务而不是来自客户端吗?

你能告诉我们你如何称呼这项服务吗?

消息的请求必须受到保护,例如合约操作所要求的('IMyService'、' http ://tempuri.org/ ')。必须通过 ('BasicHttpBinding',' http://tempuri.org/ ') 绑定来实现保护。

正如这里所说,

如果绑定不支持安全性(如 BasicHttpBinding),则整个合约的有效 System.Net.Security.ProtectionLevel 为 ProtectionLevel.None。结果是,根据端点绑定,即使合同指定了 ProtectionLevel.None,客户端也可能需要不同的消息或传输级别安全保护。

此错误消息表明您正在使用没有 ProtectionLevel 的 basicHttpBinding 调用服务。

此外,Web.configIMyServiceName中的合同与代码“IMyService”或错误消息中的合同不同。

于 2013-05-30T18:35:24.407 回答