我是网络服务的新手,所以请原谅我,除了我自己以外,每个人都很明显。
我创建了一个运行良好的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]
答案 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);