【问题标题】:Consuming WCF Data Service EF , Failed to SaveChange()使用 WCF 数据服务 EF,无法 SaveChange()
【发布时间】:2016-07-05 06:21:30
【问题描述】:

我正在使用以下 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”的传入消息(带有命名空间“http://tempuri.org/”的合同“IRequestHandler”)包含无法识别的 http 正文格式值“Xml”。预期的正文格式值为“原始”。这可能是因为尚未在绑定上配置 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>

但它仍然出现异常,我认为我的配置出了点问题。

任何帮助将不胜感激。

提前致谢。

【问题讨论】:

  • 有人知道我如何以编程方式更改 WCF 宁静服务的正文格式吗?
  • 我真的不知道该怎么办......,如果需要更多详细信息,请告诉我更新问题。

标签: odata wcf-data-services dataservice wcf-data-services-client


【解决方案1】:

好的,经过一番苦恼,我终于解决了这个问题, 所以我们需要为serviceActivation启动factory属性

所以我的相对地址是:

<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的信息

注意: 这样我们就不需要覆盖WebContentTypeMapperGetMessageFormatForContentType 并强制它返回WebContentFormat.Raw 或其他内容格式,并且不需要任何customBinding 在配置文件中。

谢谢大家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多