WCF项目库

时间:2013-05-30 15:46:06

标签: c# asp.net wcf

我想将我的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/')绑定来实现保护。

@@编辑:

我的网站.Config:

  <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>

这是我在网站root中的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
}

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我已经解决了。 问题是关于web配置中缺少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名称。
  • 在服务标签的属性名称上指定名称空间名称。
  • 删除有关端点标记的合约属性上的命名空间名称的规范。

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

答案 1 :(得分:0)

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

您能告诉我们您如何称呼此服务?

  

必须保护消息请求,例如合同操作('IMyService','http://tempuri.org/')所要求的。该   保护必须通过   ('BasicHttpBinding','http://tempuri.org/')绑定。

如上所述here

  

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

此错误消息表明您使用不带ProtectionLevel的basicHttpBinding调用该服务。

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