C# MessageSecurityException未为带有';http://...' 行动
下面是客户端和服务器都使用的配置文件C# MessageSecurityException未为带有';http://...' 行动,c#,wcf,C#,Wcf,下面是客户端和服务器都使用的配置文件 <?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <bindings> <wsHttpBinding> <binding name="WSHttpBinding_IPM_Service" closeTimeout="00:01:00"
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IPM_Service" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Message">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true"
algorithmSuite="Default" establishSecurityContext="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:8080/PM_Service"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IPM_Service"
contract="IPM_Service" name="WSHttpBinding_IPM_Service">
<identity>
</identity>
</endpoint>
</client>
</system.serviceModel>
</configuration>
第二行是异常发生的位置。
ProgrammingMaster\u ServiceClient
是使用svcutil.exe工具创建的
这是我用来启动服务器的代码
public bool StartService(string aIp)
{
string lsInstanceId = pFBlock.InstanceId.ToString();
Uri loBaseAddr = new Uri(string.Format("http://localhost:808{0}/{1}", lsInstanceId, pFBlock.FBlockName));
pLocalHost = new ServiceHost(typeof(Shadow_ProgrammingMasterService), loBaseAddr);
Start(aIp);
return IsHostOpen;
}
private void Start(string aIp)
{
Shadow_ProgrammingMasterService.SetAPI(this);
try
{
pLocalHost.AddServiceEndpoint(typeof(IProgrammingMaster_Service), new WSHttpBinding(), "PM_Service");
ServiceMetadataBehavior loSmb = new ServiceMetadataBehavior();
loSmb.HttpGetEnabled = true;
pLocalHost.Description.Behaviors.Add(loSmb);
try
{
pLocalHost.Open();
IsHostOpen = true;
pPM_Client = new ProgrammingMasterProxyClient(this, pOutput);
pPM_Client.IpAddress = aIp;
this.Subscribe(pPM_Client);
pOutput.setComment("ProgrammingMasterService initialized");
}
catch (CommunicationException ce)
{
pOutput.setError(ce.Message);
pLocalHost.Abort();
IsHostOpen = false;
}
}
catch (CommunicationException ex)
{
pOutput.setError(ex.Message);
pLocalHost.Abort();
IsHostOpen = false;
//this.Unsubscribe(pOSTTSClient);
//pOSTTSClient = null;
}
}
有人知道是什么导致了这一切吗 在您的案例中出现这种情况的原因很简单,就是
WCF
服务代码本身已被修改、重新编译(并基本上部署在调试器中),而现在已过时的服务引用的客户端正在期待并依赖于可能发生更改的内容,因此冲突接踵而至
更新客户端的服务引用将更正此问题
继续说下去,上面并不是说一旦客户端引用了服务本身中的任何代码,就不能对其进行更改(不破坏客户端),但是,这样的问题表明客户端所依赖的服务部分发生了实质性的更改,例如公开方法的签名,现有DataMember
现有DataContract
类型等的属性
相反,您可以将现有服务调用的方法体更改为您的核心内容(客户机不关心服务如何工作,只关心如何使其工作);您还可以将新成员添加到现有的复合
DataContract
类型中,以便新客户端可以随时使用您的更新,从而防止DataType2
类型出现冗余等情况。您的服务客户端代理完全是最新的吗?@Disapointment先生-我想是的,但我想我已经有一段时间没有更改它了。“我来核实一下。”失望先生——就是这样。谢谢如果你回答我,我会接受的。非常感谢!值得注意的是,如果使用可靠消息传递,则此无帮助的错误消息可能会隐藏在另一个错误消息下面:“在可靠会话完全完成之前,基础安全会话已发生故障。可靠会话已发生故障。”。此问题的错误仅出现在跟踪日志中。如果您没有使用服务引用,该怎么办?到底怎么了?请注意,此消息与消息安全性有关,而与方法签名无关。消息中的“签名”指的是加密签名。
public bool StartService(string aIp)
{
string lsInstanceId = pFBlock.InstanceId.ToString();
Uri loBaseAddr = new Uri(string.Format("http://localhost:808{0}/{1}", lsInstanceId, pFBlock.FBlockName));
pLocalHost = new ServiceHost(typeof(Shadow_ProgrammingMasterService), loBaseAddr);
Start(aIp);
return IsHostOpen;
}
private void Start(string aIp)
{
Shadow_ProgrammingMasterService.SetAPI(this);
try
{
pLocalHost.AddServiceEndpoint(typeof(IProgrammingMaster_Service), new WSHttpBinding(), "PM_Service");
ServiceMetadataBehavior loSmb = new ServiceMetadataBehavior();
loSmb.HttpGetEnabled = true;
pLocalHost.Description.Behaviors.Add(loSmb);
try
{
pLocalHost.Open();
IsHostOpen = true;
pPM_Client = new ProgrammingMasterProxyClient(this, pOutput);
pPM_Client.IpAddress = aIp;
this.Subscribe(pPM_Client);
pOutput.setComment("ProgrammingMasterService initialized");
}
catch (CommunicationException ce)
{
pOutput.setError(ce.Message);
pLocalHost.Abort();
IsHostOpen = false;
}
}
catch (CommunicationException ex)
{
pOutput.setError(ex.Message);
pLocalHost.Abort();
IsHostOpen = false;
//this.Unsubscribe(pOSTTSClient);
//pOSTTSClient = null;
}
}