WCF Web服务方法名称

时间:2011-05-17 16:50:30

标签: c# wcf web-services

我是网络服务的新手,所以请原谅我,除了我自己以外,每个人都很明显。

我创建了一个运行良好的WCF C#Web服务。然后我创建了Java和一个C#客户端来使用输出,这也很好。

困扰我的是我无法弄清楚如何控制代理中创建的方法的名称。在服务中,我有一个名为getCategory的方法,但是在生成的客户端代码中(使用Netbeans的Java和使用VS的C#),相应的方法被命名为getX003CCategoryX003EKBackingField()。

是否可以控制此名称?

编辑: 以下是该服务的摘录:

 [OperationContract(Name="GetCategoryObject")]
        UrlCategory2 GetCategoryObject(string URL);

合同:

 [DataMember(Name="getCategory")]
        public string Category {
            get;
            set;
        }

我使用Eclipse和Visual Studio中的WSDL读取自动化生成代码。

第二次编辑:这应该包含所有相关位。

namespace MyService.ServiceContracts
{
    [ServiceContract(Name = "ICategorizer", Namespace = "MyService.ServiceContracts", SessionMode = SessionMode.Allowed)]
    public interface ICategorizer 
    {
        [OperationContract(Name="GetCategoryObject")]
        UrlCategory2 GetCategoryObject(string URL);

        [OperationContract]
        string getCategoryAsString(string URL);

    }
}

namespace MyService.DataContracts {

    [Serializable]
    public class UrlCategory2 {

        [DataMember(Name = "getCategoryEn")]
        public string CategoryEn {
            get;
            set;
        }

        [DataMember(Name = "getCategoryFr")]
        public string PawsCategoryFr {
            get;
            set;
        }

        [DataMember(Name="getCategory")]
        public string Category {
            get;
            set;
        }
    }
}
namespace MyService
{
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerSession, UseSynchronizationContext = false)]
    public class MyService : ICategorizer
    {
        ...
        public UrlCategory2 GetCategory(string URL) {...}
        ...
        public UrlCategory2 GetCategoryObject(string URL) {...}

    }
}           

[wsdl:operation name="GetCategoryObject"]
[soap:operation soapAction="MyService.ServiceContracts/ICategorizer/GetCategoryObject" style="document"/]
[wsdl:input]
[soap:body use="literal"/]
[/wsdl:input]
[wsdl:output]
[soap:body use="literal"/]
[/wsdl:output]
[/wsdl:operation]
[wsdl:operation name="GetCategory"]
[soap:operation soapAction="MyService.ServiceContracts/ICategorizer/GetCategory" style="document"/]
[wsdl:input]
[soap:body use="literal"/]
[/wsdl:input]

2 个答案:

答案 0 :(得分:3)

发布WCF服务的代码,您也如何生成代理?通常,它们在代理中的名称与服务中的名称相同。

您可以在方法(在服务中)使用[OperationContract(Name= "Foo")]来指定特定名称。

答案 1 :(得分:0)

根据您的代码片段判断,我不清楚您是如何设置此代码的。

在班级

[DataMember(Name="getCategory")] public string Category { get; set; }

已定义,您是否还将该类指定为[DataContract]? 它通常应该类似于:

[ServiceContract]
public interface IMyService
{
    [OperationContract(Name="GetCategoryObject")]
    UrlCategory2 GetCategoryObject(string url);
}

public class MyService : IMyService
{
    public UrlCategory2 GetCategoryObject(string url)
    {
        return new UrlCategory2();
    }
}

[DataContract]
public class UrlCategory2
{
    [DataMember(Name="getCategory")]
    public string Category { get; set; }
}

我在您的代码段中没有看到您如何将Category纳入您的服务。你有类似的东西:

[ServiceContract]
public interface IMyService
{
    [OperationContract(Name="GetCategoryObject")]
    UrlCategory2 GetCategoryObject(string url);

    [DataMember(Name="getCategory")]
    public string Category { get; set; }
}

如果是这样,那么这可能是你的问题; WCF服务(在[ServiceContract]装饰类中)通常不具有属性。最好只使用方法。它可能试图将属性的getter和setter方法映射到WSDL中的2个单独的服务方法。

可能会将其更改为:

[OperationContract]
string GetCategory();

[OperationContract]
void SetCategory(string category);