Использование службы данных WCF EF, не удалось сохранить Change()

Я использую Службу данных WCF следующим образом:

 DataMan.ContextWrapper context = new DataMan.ContextWrapper(new Uri("http://localhost:2060/PCM/DataMan.svc/rest/"));
            DataMan.Report newReport = DataMan.Report.CreateReport("123123123123", DateTime.Now, "999.199905171156550187000.25");

            newReport.Title = "tt";
            newReport.StudyAcDate = Convert.ToDateTime("2016-05-04 12:09:00");
            newReport.Body = "asdasd";
            newReport.Auther = "ali.h";
            newReport.ApproverComment = "cm";
            newReport.Approver = "admin";
            context.AddToReports(newReport);
            DataServiceResponse response = context.SaveChanges();

но после звонка SaveChange() Я получил следующую ошибку:

Сервер обнаружил ошибку при обработке запроса. Сообщение об исключении: "Входящее сообщение для операции" ProcessRequestForMessage "(контракт" IRequestHandler "с пространством имен" http://tempuri.org/ ") содержит нераспознанное значение формата тела HTTP" Xml ". Ожидаемое значение формата тела - "Raw". Это может быть связано с тем, что в привязке не настроен WebContentTypeMapper. См. Документацию WebContentTypeMapper для более подробной информации. '. Смотрите журналы сервера для более подробной информации.

и моя служба данных WCF выглядит следующим образом:

 public class ContextWrapper : DataAccessDbContext
{
    public ContextWrapper() : base("connection string")
    {

    }
}

[JSONPSupportBehavior]
public class DataMan : EntityFrameworkDataService<ContextWrapper>
{
    public static void InitializeService(DataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule("*", EntitySetRights.All);
        config.SetEntitySetAccessRule("Studies", EntitySetRights.None);
        config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
        config.UseVerboseErrors = true; // TODO - Remove for production?
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
    }
    protected override void HandleException(HandleExceptionArgs args)
    {
        base.HandleException(args);
    }
}

Я также реализовал и настроил WebContentTypeMapper обойти упомянутую ошибку следующим образом:

 public class ContentTypeMapper : WebContentTypeMapper
{
    public override WebContentFormat GetMessageFormatForContentType(string contentType)
    {
        return WebContentFormat.Raw;
    }
} 

Пользовательская привязка:

   <binding name="XmlMapper">
      <webMessageEncoding webContentTypeMapperType="MARCO.SOA.PCMServiceLib.ContentTypeMapper,MARCO.SOA.PCMServiceLib.Core"/>
      <httpTransport manualAddressing="true"/>
    </binding>
  </customBinding>

Конечная точка сервиса:

 <service behaviorConfiguration="Commom2.Behavior" name="MARCO.SOA.PCMServiceLib.DataMan">
    <endpoint address="rest" behaviorConfiguration="Rest.Behavior" binding="webHttpBinding" 
              bindingConfiguration="XmlMapper" contract="System.Data.Services.IRequestHandler">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:2060/PCM/DataMan.svc"/>
      </baseAddresses>
    </host>
  </service>

но это все еще исключение, я думаю, что-то пошло не так с моей конфигурацией.

Любая помощь будет по достоинству оценена.

Заранее спасибо.

1 ответ

Решение

Хорошо, после долгих хлопот я наконец решил проблему, поэтому нам нужно начать factory собственность для serviceActivation

Итак, мой относительный адрес был:

<serviceHostingEnvironment>
  <serviceActivations>
.
.
.
   <add relativeAddress="DataMan.svc" service="MARCO.SOA.PCMServiceLib.DataMan"/>
.
.
.
  </serviceActivations>
</serviceHostingEnvironment>

и я изменил его на

<serviceHostingEnvironment>
  <serviceActivations>
.
.
.
    <add relativeAddress="DataMan.svc" service="MARCO.SOA.PCMServiceLib.DataMan" factory="System.Data.Services.DataServiceHostFactory, Microsoft.Data.Services, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
.
.
.
  </serviceActivations>
</serviceHostingEnvironment>

теперь все теперь работает хорошо.

больше информации о DataServiceHostFactory

Примечание: этим нам не нужно переопределять GetMessageFormatForContentType из WebContentTypeMapper и заставить его вернуться WebContentFormat.Raw или другой формат контента и не нужно никаких customBinding в конфигурационном файле.

Спасибо всем.

Другие вопросы по тегам