我有一个WCF服务可以正常工作,但确实需要缓存响应。 我在网上遵循了一些指导,但收到以下错误:
@Entity
public class RecordingEntity implements Serializable
{
private static final long serialVersionUID = 1L;
@Column(name = "channel_one")
private byte[] channelOneAsByteArray;
@Column(name = "channel_two")
private byte[] channelTwoAsByteArray;
@Column(name = "channel_three")
private byte[] channelThreeAsByteArray;
...
public RecordingEntity(List<Long[]> recordingList, File rawFile, Recording recording)
{
this.recording = recording;
ObjectMapper mapper = new ObjectMapper();
try
{
rawFileAsByteArray = mapper.writeValueAsBytes(rawFile);
}
catch (JsonProcessingException e)
{
LOGGER.error(e.getMessage(), e);
}
setRecordingList(recordingList);
}
...
public List<Long[]> getRecordingList()
{
List<Trigger[]> recordingList = new ArrayList<>();
int channels = recording.getChannels();
Long[] channelOne = (Long[]) SerializationUtils.deserialize(channelOneAsByteArray);
Long[] channelTwo = (Long[]) SerializationUtils.deserialize(channelTwoAsByteArray);
Long[] channelThree = (Long[]) SerializationUtils.deserialize(channelThreeAsByteArray);
for (int i = 0; i < channelOneAsByteArray.length; i++)
{
Long[] positionArray = new Long[channels];
if (0 < channels)
{
positionArray[0] = channelOne[I];
}
if (1 < channels)
{
positionArray[1] = channelTwo[I];
}
if (2 < channels)
{
positionArray[2] = channelThree[I];
}
recordingList.add(positionArray);
}
return recordingList;
}
...
public void setRecordingList(List<Long[]> recordingList)
{
int channels = recording.getChannels();
long[] channelOne = new long[recordingList.size()];
long[] channelTwo = new long[recordingList.size()];
long[] channelThree = new long[recordingList.size()];
for (Long[] positionArray : recordingList)
{
int index = 0;
if (0 < channels)
{
channelOne[index] = positionArray[0];
}
if (1 < channels)
{
channelTwo[index] = positionArray[1];
}
if (2 < channels)
{
channelThree[index] = positionArray[2];
}
index++;
}
channelOneAsByteArray = SerializationUtils.serialize(channelOne);
channelTwoAsByteArray = SerializationUtils.serialize(channelTwo);
channelThreeAsByteArray = SerializationUtils.serialize(channelThree);
}
}
我在Postman中检查过这一点,以确保我的客户端代码没有以错误的方式提出请求,结果相同。
界面如下所示:
AspNetCacheProfileAttribute can only be used with GET operations.
该服务返回一个List作为JSON对象,我尝试添加的2个更改并添加缓存是为了向类添加AspNetCacheProfile属性并将缓存配置文件详细信息添加到我的web.config。
类的属性:
public interface INavbar
{
[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
List<Navbar.simpleNav> getNavList();
}
的web.config:
[AspNetCacheProfile("CacheFor180Seconds")]
据我所知,这些都是非常标准的东西,但可能是因为我试图以错误的方式做到这一点,所以任何帮助都会受到赞赏。
非常感谢
答案 0 :(得分:1)
差异很微妙但很重要:
表示一个属性,指示服务操作在逻辑上是调用操作,并且可以由WCF REST编程模型调用。
表示一个属性,指示服务操作在逻辑上是检索操作,并且可以由WCF REST编程模型调用。
进一步说,在WebInvoke的备注部分:
WebInvokeAttribute属性应用于服务操作...并将操作与UriTemplate以及表示调用的基础传输动词(例如,HTTP POST,PUT或DELETE)相关联。 ... WebInvokeAttribute确定服务操作响应的HTTP方法。默认情况下,应用了WebInvokeAttribute的所有方法都会响应POST请求。 Method属性允许您指定不同的HTTP方法。 如果您希望服务操作响应GET,请改用WebGetAttribute。