我想将我的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
}
有什么想法吗?
答案 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>
我想每个人都可以开始疯狂!! !!
嗯,正如你所看到的,我不得不:
好的我已经解决了,但我对下一个未来有点担心.. !!
答案 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”或错误消息中的合同不同。