ServiceStack:为什么我的呼叫未解决纠正路由?

时间:2013-05-06 19:47:22

标签: servicestack

我正在使用带有IReturn界面的“新”API。我的所有调用都被解析为/ api / json / syncreply路由,而不是插件注册中指定的那些。

如果我在浏览器中点击了网址,我会得到正确的回复,因此该部分正在运行,但如果使用JsonServiceClient则无法正确解析路由。

var dataService = new JsonServiceClient(baseUri);
dataService.Get(new BaseProductBenefitTypeEdit() { Code = ((BaseProductBenefitTypeInfo)obj).Code }
                             , onSuccess, onError);

DTOS

public class BaseProductBenefitTypeEdit : IReturn<BaseProductBenefitTypeEditResponse>
{
    public string Code { get; set; }
}

public class BaseProductBenefitTypeEditResponse : IHasResponseStatus
{
    public BaseProductBenefitTypeEditInfo BenefitType { get; set; }

    public List<KeyValuePair> AvailableMostCommon { get; set; }
    public List<KeyValuePair> AvailableTypes { get; set; }

    public ResponseStatus ResponseStatus { get; set; }
}

我有插件

 public class MaintenanceModule : IPlugin
    {
        public void Register(IAppHost appHost)
        {

            //baseProductBenefitTypes
            appHost.Routes.Add<BaseProductBenefitTypeList>("/baseProductBenefitTypes", "GET");
            appHost.Routes.Add<BaseProductBenefitTypeEdit>("/baseProductBenefitTypes/{code}/editForm", "GET");
            appHost.Routes.Add<BaseProductBenefitTypeCreate>("/baseProductBenefitTypes/createForm", "GET");
            appHost.Routes.Add<BaseProductBenefitTypeSave>("/baseProductBenefitTypes/{code}", "PUT");
            appHost.Routes.Add<ChangeBaseProductBenefitTypesDisplayOrder>("/baseProductBenefitTypes/displayOrders", "POST");

            appHost.RegisterService<BaseProductBenefitTypeService>();
在Application_Start i调用

中的应用程序开始时的Global.asax中的

   ServiceStackInitilizer.Run();

看起来像这样

 public static class ServiceStackInitilizer
    {
        public static void Run()
        {
            var type = typeof(ServiceStack.ServiceInterface.Service);
            var types = AppDomain.CurrentDomain.GetAssemblies()
                                 .Where(x=>x.GetName().Name.StartsWith("MyApplication"))
                                 .SelectMany(a => a.GetTypes())
                                 .Where(type.IsAssignableFrom);

            var assemblies = types.GroupBy(t => t.Assembly).Select(g => g.Key).ToArray();

            new WebServiceAppHost("WebServiceAppHost", assemblies).Init();

        }
    }

在WebServiceAppHost配置方法中,我注册了插件:

 public override void Configure(Funq.Container container)
        {


            JsConfig.IncludeNullValues = true;

            SetConfig(new EndpointHostConfig
            {
                ServiceStackHandlerFactoryPath = "api",
                DefaultContentType = ServiceStack.Common.Web.ContentType.Json,
                DefaultJsonpCacheExpiration = new TimeSpan(0, 0, 0, 0),
                GlobalResponseHeaders = { { "Cache-Control", "no-cache" } },
            });

            container.Adapter = new StructureMapContainerAdapter();

            RegisterMyPlugins();
        }

private void RegisterMyPlugins()
        {
            var type = typeof(IPlugin);
            var plugins = AppDomain.CurrentDomain.GetAssemblies()
                                 .Where(x => x.GetName().Name.StartsWith("Application"))
                                 .SelectMany(a => a.GetTypes())
                                 .Where(type.IsAssignableFrom);

            foreach (var plugin in plugins)
            {
                Plugins.Add((IPlugin)plugin.CreateInstance());
            }
        }

1 个答案:

答案 0 :(得分:1)

  

我正在使用带有IReturn界面的“新”API。我所有的电话都在   解析为/ api / json / syncreply路由,而不是指定的路由   在插件注册中。

     

如果我在浏览器中点击了网址,我会得到正确的回复,因此该部分就是   工作,但如果使用JsonServiceClient它不解析路由   正确。

请记住,在调用您的服务时,服务客户端可以访问的唯一工件和元数据是DTO。因此,您需要使用[Route]属性,以便客户端能够使用任何自定义的用户定义路由。