这是客户端和服务器使用的配置文件
<?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_ServiceClient aClient = new ProgrammingMaster_ServiceClient();
aClient.BeginProgrammingSession(0x01);
aClient.Close();
第二行是发生异常的地方。
ProgrammingMaster_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;
}
}
任何人都有任何可能导致这种情况的想法?
答案 0 :(得分:12)
在您的情况下发生这种情况的原因很简单,WCF
服务代码本身已被修改,重新编译(并且基本上部署在调试器中),而客户端(具有现在过时的服务引用)期待并且取决于受此变化影响的事情,因此发生冲突。
更新客户端的服务引用将解决此问题。
要继续,上述并不是说一旦客户端引用了服务本身(不破坏客户端),就不能更改服务中的任何代码,但是,这样的问题表明部分内容发生了重大变化。客户端所依赖的服务,例如公开方法的签名,现有DataMember
类型的现有DataContract
属性等。
相比之下,您可以将现有服务调用的方法体更改为您心脏的内容(客户端不关心 服务如何工作,只是如何制作这行得通);您还可以向现有复合DataContract
类型添加新成员,以便新客户端可以轻松使用您的更新,防止出现冗余的DataType2
类型方案,等等。