odata4j多次请求元数据

时间:2016-05-02 10:29:25

标签: android odata4j

我使用odata4j库来访问WCF数据服务。

这就是我从Android代码中调用服务方法的方法:

 OQueryRequest<OEntity> l = consumer.getEntities("GetDataList")
    .custom("dataId", String.format("'%s'", actualData.ID))
    .orderBy("Name").skip(0).top(200);

我用WireShark检查过,我发现每个方法调用前面都有 2次调用的元数据信息请求:

enter image description here

为什么呢?它们必不可少?元数据信息非常繁重,每次都不应该请求(更不用说2次)。

我该怎么做才能阻止odata4j多次请求元数据信息?

1 个答案:

答案 0 :(得分:0)

我在源代码中发现“额外”请求发生(在odata4j/odata4j-core/src/main/java/org/odata4j/consumer/AbstractODataConsumer.java中):

@Override
public EdmEntitySet findEdmEntitySet(String entitySetName) {
  EdmEntitySet rt = super.findEdmEntitySet(entitySetName);
  if (rt == null && delegate != EdmDataServices.EMPTY) {
    refreshDelegate();
    rt = super.findEdmEntitySet(entitySetName);
  }
  return rt;
}

似乎如果找不到实体集,则消费者会向服务器创建额外的往返,以再次获取元数据(通过调用refreshDelegate()):

private void refreshDelegate() {
  ODataClientRequest request = ODataClientRequest.get(AbstractODataConsumer.this.getServiceRootUri() + "$metadata");
  try {
    delegate = AbstractODataConsumer.this.getClient().getMetadata(request);
  } catch (ODataProducerException e) {
    // to support services that do not expose metadata information
    delegate = EdmDataServices.EMPTY;
  }
}

我不太明白为什么:也许它假定服务器已经更改并且新版本的元数据可用,因此它会再次尝试。

如果失败,则尝试查找具有给定名称的函数

个人我不认为这非常有效,除非服务器端非常易变,以致它在不同呼叫之间发生变化。

因此,如果您在服务器上没有更改元数据,则可以安全地删除entitySet的检查,并将其作为null返回:

@Override
public EdmEntitySet findEdmEntitySet(String entitySetName) {
  EdmEntitySet rt = super.findEdmEntitySet(entitySetName);
  //if (rt == null && delegate != EdmDataServices.EMPTY) {
  //  refreshDelegate();
  //  rt = super.findEdmEntitySet(entitySetName);
  //}
  return rt; //if it is null, then the search for a function will commence
}