我正在使用WCF创建服务器,并使用函数属性创建不同的端点地址,如下例所示:
from PIL import Image
from pytesseract.pytesseract import *
im=Image.open('NA2WK.png')
#calculate far left xpos of color
color={}
for i in range(52):
for j in range(26):
if im.load()[i,j]!=(192,192,192,255):
if color.get(im.load()[i,j])==None:
color[im.load()[i,j]]=9999
if i<color[im.load()[i,j]]:
color[im.load()[i,j]]=i
#get color of left character
if color.values()[0]<color.values()[1]:
left=color.keys()[0]
right=color.keys()[1]
else:
left=color.keys()[1]
right=color.keys()[0]
#left processing
imleft=Image.open('test.png')
pix=imleft.load()
for i in range(52):
for j in range(26):
if pix[i,j]==(192,192,192,255) or pix[i,j]==right:
pix[i,j]=(255,255,255,255)
else:
pix[i,j]=(0,0,0,255)
print('original:'+image_to_string(im))
print('left:'+image_to_string(imleft))
然后,在客户端库中,我们定义了相同的数据,以便动态构建url,如下所示:
[OperationContract]
[FaultContract(typeof(ErrorClass))]
[WebInvoke(Method = "POST", UriTemplate = "/endpoint/adress", ResponseFormat = WebMessageFormat.Json)]
public async Task<Stream> EndpointFunction(Stream someContent)
{
magic
}
我真的很想不要在这两个地方硬编码端点地址。在c ++中,我将定义一个宏#ENDPOINTADRESS&#34; / endpoint / Adress&#34;并在两个地方使用它,但C#中不存在宏。有没有办法避免这种代码重复?
答案 0 :(得分:0)
不幸的是,属性及其值被编译到程序集中。因此,无法在运行时设置它们的值。
但是,如果您从客户端可以引用定义服务器类的程序集,则可以在客户端使用反射来检索属性值。像这样:
// TODO: Add all kinds of safety checks
var mi = typeof(ServerImplementationClass).GetMethod("EndpointFunction");
var atts = mi.GetCustomAttributes(false);
var wi = atts.OfType<WebInvokeAttribute>().FirstOrDefault();
var uri = wi.UriTemplate; // Yields: "/endpoint/adress"