문제

내 서비스 참조에서 사용되는 네임스페이스와 관련된 문제가 있습니다.네임스페이스와 같은 여러 WCF 서비스가 있습니다. MyCompany.Services.MyProduct (실제 네임스페이스는 더 깁니다.).
제품의 일부로 샘플 C# .NET 웹 사이트도 제공하고 있습니다.이 웹 애플리케이션은 네임스페이스를 사용합니다. MyCompany.MyProduct.

초기 개발 과정에서 서비스는 웹사이트에 프로젝트 참조로 추가되어 직접 사용되었습니다.구현하는 객체 인스턴스를 반환하는 팩토리 패턴을 사용했습니다. MyCompany.Services.MyProduct.IMyService.여태까지는 그런대로 잘됐다.

이제 실제 서비스 참조를 사용하도록 이를 변경하고 싶습니다.참조를 추가하고 입력한 후 MyCompany.Services.MyProduct 네임스페이스 텍스트 상자에서 네임스페이스에 클래스를 생성합니다. MyCompany.MyProduct.MyCompany.Services.MyProduct. 나쁜! 난 변하고 싶지 않아 using 프록시 클래스를 사용하고 있다는 이유만으로 여러 위치에 지시문이 있습니다.그래서 네임스페이스 앞에 다음을 추가해 보았습니다. global::, 그러나 그것은 받아들여지지 않습니다.

아직 원래 어셈블리 참조를 삭제하지 않았으며 "재사용 유형"이 활성화되어 있지만 재사용이 수행되지 않은 것으로 보입니다. 그러나 어쨌든 작동하기 위해 샘플 웹 사이트에 어셈블리 참조를 유지하고 싶지 않습니다..

지금까지 제가 생각해낸 유일한 해결책은 웹 애플리케이션의 기본 네임스페이스를 다음으로 설정하는 것입니다. MyCompany (비워둘 수 없기 때문에) 서비스 참조를 다음과 같이 추가합니다. Services.MyProduct.고객이 내 샘플 웹사이트를 시작점으로 사용하기를 원하고 기본 네임스페이스를 다음으로 변경한다고 가정해 보겠습니다. OtherCompany.Whatever, 이것은 분명히 내 해결 방법을 깨뜨릴 것입니다.

이 문제에 대한 좋은 해결책이 있습니까?

요약:어셈블리를 참조하지 않고 원래 네임스페이스에 서비스 참조 프록시를 생성하고 싶습니다.

메모:나는 보았다 이 질문, 그러나 내 사용 사례에 적합한 솔루션이 제공되지 않았습니다.


편집하다:John Saunders가 제안한 대로 저는 이에 대해 Microsoft에 몇 가지 피드백을 제출했습니다.
피드백 항목 @ Microsoft Connect

도움이 되었습니까?

해결책

나는 이 솔루션의 작성 내 블로그에.실제로 동일한 정보이지만 아마도 조금 덜 단편화되었을 것입니다.

나는 사용에 대한 대안을 찾았습니다 svcutil.exe 내가 원하는 것을 이루기 위해.(imo) 유틸리티를 다시 실행하는 것보다 서비스 참조를 더 쉽게 업데이트할 수 있습니다.

ServiceContract 및 DataContracts에 네임스페이스 URI를 명시적으로 지정해야 합니다(의견은 아래 추가 내용을 참조하세요.).

[ServiceContract(Namespace = "http://company.com/MyCompany.Services.MyProduct")]
public interface IService
{
    [OperationContract]
    CompositeType GetData();
}

[DataContract(Namespace = "http://company.com/MyCompany.Services.MyProduct")]
public class CompositeType
{
    // Whatever
}

네임스페이스는 무엇이든 될 수 있지만 기술적으로는 유효한 URI여야 하므로 이 구성표를 선택했습니다.나중에 작업하려면 수동으로 빌드해야 할 수도 있으므로 그렇게 하세요.

이 작업이 완료되면 모든 파일 표시 솔루션 탐색기의 옵션.이전에 추가한 서비스 참조를 확장합니다.두 번 클릭 Reference.svcmap 파일.

있을 것이다 <NamespaceMappings /> 편집해야 하는 요소입니다.계속해서 내 예를 들어 보겠습니다.

<NamespaceMappings>
    <NamespaceMapping
        TargetNamespace="http://company.com/MyCompany.Services.MyProduct"
        ClrNamespace="MyCompany.Services.MyProduct" />
</NamespaceMappings>

파일을 저장하고 서비스 참조를 마우스 오른쪽 버튼으로 클릭한 후 업데이트 서비스 참조.

필요한 만큼 매핑을 추가할 수 있습니다(실제로는 두 개가 필요했습니다).효과는 과 동일합니다 svcutil /namespace: 하지만 명령줄 유틸리티 자체를 사용할 필요가 없으므로 업데이트가 더 쉽습니다.

svcutil과의 차이점

이 접근 방식의 단점은 명시적인 네임스페이스 매핑을 사용해야 한다는 것입니다.사용 svcutil, 다음과 같이 명시적으로 매핑되지 않은 모든 것을 매핑할 수 있는 옵션이 있습니다(John Saunders가 언급한 솔루션).

svcutil /namespace:*,MyCompany.Services.MyProduct ...

다음을 사용하는 것이 좋습니다.

<NamespaceMappings>
    <NamespaceMapping
        TargetNamespace="*"
        ClrNamespace="MyCompany.Services.MyProduct" />
</NamespaceMappings>

하지만 이건 그럴 거야 ~ 아니다 왜냐하면 Visual Studio가 제거하려는 생성된 네임스페이스 이름을 가리키는 이 매핑을 이미 암시적으로 추가했기 때문입니다.위 구성으로 인해 Visual Studio에서 중복 키에 대해 불평하게 됩니다.

광고 명시적 네임스페이스:
코드에 명시적 네임스페이스가 지정되지 않은 경우 것 같다 해당 .NET은 다음 형식의 URI를 생성합니다. http://schemas.datacontract.org/2004/07/MyCompany.Services.MyProduct.내 예에서 명시적 네임스페이스와 마찬가지로 이를 매핑할 수 있지만 이 동작이 보장되는지는 모르겠습니다.따라서 명시적인 네임스페이스를 사용하는 것이 더 나을 수도 있습니다.

참고:두 개의 TargetNamespace를 동일한 ClrNamespace에 매핑하면 코드 생성이 중단되는 것 같습니다.

다른 팁

유스 케이스가 잘못되었습니다.

처음에는 서비스를 참조로 포함 시켜서는 안됩니다.

Svcutil.exe는 사용할 풀 네임 스페이스를 지정하는 스위치를 수락 할 것이라고 생각합니다.

VS2010 이상 버전에는 사용자 정의 네임 스페이스를 설정하는 방법이 있습니다. 솔루션 탐색기에서 "모든 파일 표시"를 선택한 다음 솔루션 트리에서 "웹 참조"를 열고 서비스를 선택하고 참조 노드를 선택하고 속성을 표시하고 사용자 정의 도구 네임 스페이스 속성을 설정하십시오.

불행히도 나는 스크린 샷을 보여줄 명성이 충분하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top