2011-05-17 36 views
2

我對web服務完全陌生,所以請原諒,如果這對每個人都是顯而易見的,但除了我自己。WCF Web服務方式名稱

我創建了一個運行良好的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; 
     } 

我生成使用WSDL代碼閱讀在Eclipse和Visual Studio自動化。

SECOND EDIT:這應該有所有的相關位。

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

能取悅你張貼服務的WSDL,如果它是不是太大?如果它太大,至少GetCategoryObject操作的「wsdl:operation」元素。 – 2011-05-17 17:44:41

+1

對於格式化混亂的抱歉 - 我的第一篇文章,我仍然試圖找出標記 – Javawanabe 2011-05-17 19:30:12

+0

代碼塊每行開始四個空格。最簡單的方法是標記代碼,然後按下「{}」按鈕(我冒昧地爲您做)。 – 2011-05-17 19:42:53

回答

3

發佈您的WCF服務代碼,以及如何生成代理?通常,它們在代理中與它們在服務中的名稱相同。

您可以在您的方法(在服務中)使用[OperationContract(Name= "Foo")]來指定特定的名稱。

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; } 
} 

我不知道你是如何裝修類別爲您服務您的代碼段。你有類似的東西:

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

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

如果是這樣,那麼這可能是你的問題; WCF服務(在[ServiceContract]裝飾類中)通常不具有屬性。只使用方法更好。它可能試圖將屬性的getter和setter方法映射到WSDL中的兩個單獨的服務方法。

也許它更改爲:

[OperationContract] 
string GetCategory(); 

[OperationContract] 
void SetCategory(string category);