缓存wcf服务的问题 - “AspNetCacheProfileAttribute只能用于GET操作”

时间:2018-06-13 09:41:00

标签: c# asp.net wcf caching

我有一个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")]

据我所知,这些都是非常标准的东西,但可能是因为我试图以错误的方式做到这一点,所以任何帮助都会受到赞赏。

非常感谢

1 个答案:

答案 0 :(得分:1)

您需要使用WebGet而不是WebInvoke

差异很微妙但很重要:

WebInvoke

  

表示一个属性,指示服务操作在逻辑上是调用操作,并且可以由WCF REST编程模型调用。

WebGet

  

表示一个属性,指示服务操作在逻辑上是检索操作,并且可以由WCF REST编程模型调用。

进一步说,在WebInvoke的备注部分:

  

WebInvokeAttribute属性应用于服务操作...并将操作与UriTemplate以及表示调用的基础传输动词(例如,HTTP POST,PUT或DELETE)相关联。 ... WebInvokeAttribute确定服务操作响应的HTTP方法。默认情况下,应用了WebInvokeAttribute的所有方法都会响应POST请求。 Method属性允许您指定不同的HTTP方法。 如果您希望服务操作响应GET,请改用WebGetAttribute。