MessageSecurityException Для сообщений с действием «http: // ...» не было указано частей подписи. - PullRequest
4 голосов
/ 17 февраля 2011

вот файл конфигурации, используемый и клиентом, и сервером

<?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;
    }
}

У всех есть идеи, что может быть причиной этого.?

1 Ответ

12 голосов
/ 18 февраля 2011

Причина, по которой это происходит в вашем случае, заключается просто в том, что сам код службы WCF был изменен, перекомпилирован (и, по существу, развернут в отладчике), в то время как клиент, имеющий теперь устаревшую ссылку на службу, ожидает и зависит от что-то, подверженное этому изменению и, следовательно, конфликты.

Обновление сервисной ссылки для клиента исправит эту проблему.

Чтобы продолжить, вышесказанное не означает, что вы не можете изменить какой-либо код внутри самой службы, если на него ссылается клиент (без прерывания клиента), поэтому такая проблема предполагает существенные изменения в некоторых частях служба, от которой зависит клиент, например, подписи открытых методов, существующие DataMember свойства существующих DataContract типов и т. п.

В отличие от этого, вы можете изменить тело метода существующих вызовов службы на удовлетворение вашего сердца (клиенту все равно как служба работает, как заставить работать) ); Вы также можете добавлять новых членов к существующим составным типам DataContract, чтобы новые клиенты могли легко использовать ваши обновления, предотвращая сценарии типа DataType2 с избыточностью и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...